|  | 
 
| UNICODE 环境下VC++快速取得文件HASH MD5 在VC++中获取文件的MD5哈希值,可以使用Windows API和CryptoAPI。以下是一个简单的示例,演示如何在Unicode环境下实现这一功能。
 首先,确保你包含了必要的头文件:
 
 复制代码#include <windows.h>
#include <wincrypt.h>
#include <iostream>
#include <string>
 然后,你可以使用以下代码获取文件的MD5哈希值:
 
 复制代码std::wstring GetFileMD5Hash(const std::wstring& filePath) {
    // 初始化CryptoAPI
    HCRYPTPROV hProv = 0;
    HCRYPTHASH hHash = 0;
    BYTE hash[16]; // MD5 produces a 16-byte hash
    DWORD hashLen = sizeof(hash);
     // 打开文件
    HANDLE hFile = CreateFileW(filePath.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE) {
        std::wcerr << L"Unable to open file: " << filePath << std::endl;
        return L"";
    }
     // 获取加密服务提供者
    if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_MD5, CRYPT_VERIFYCONTEXT)) {
        CloseHandle(hFile);
        std::wcerr << L"CryptAcquireContext failed." << std::endl;
        return L"";
    }
     // 创建哈希对象
    if (!CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash)) {
        CryptReleaseContext(hProv, 0);
        CloseHandle(hFile);
        std::wcerr << L"CryptCreateHash failed." << std::endl;
        return L"";
    }
     // 读取文件并更新哈希
    const DWORD bufferSize = 4096;
    BYTE buffer[bufferSize];
    DWORD bytesRead;
     while (ReadFile(hFile, buffer, bufferSize, &bytesRead, NULL) && bytesRead > 0) {
        CryptHashData(hHash, buffer, bytesRead, 0);
    }
     // 获取哈希值
    CryptGetHashParam(hHash, HP_HASHVAL, hash, &hashLen, 0);
     // 关闭句柄
    CryptDestroyHash(hHash);
    CryptReleaseContext(hProv, 0);
    CloseHandle(hFile);
     // 将哈希值转换为字符串
    std::wstringstream ss;
    for (DWORD i = 0; i < hashLen; i++) {
        ss << std::hex << std::setw(2) << std::setfill(L'0') << static_cast<int>(hash[i]);
    }
     return ss.str();
}
 int main() {
    std::wstring filePath = L"your_file_path_here"; // 替换为你的文件路径
    std::wstring md5Hash = GetFileMD5Hash(filePath);
    if (!md5Hash.empty()) {
        std::wcout << L"MD5 Hash: " << md5Hash << std::endl;
    }
    return 0;
}
 ### 说明:
 1. **CryptoAPI**:我们使用CryptoAPI来计算MD5哈希。
 2. **Unicode支持**:代码使用 `std::wstring` 以确保支持Unicode。
 3. **文件读取**:使用 `CreateFileW` 打开文件,并通过 `ReadFile` 读取文件内容。
 4. **哈希计算**:通过 `CryptHashData` 更新哈希值,最后通过 `CryptGetHashParam` 获取最终的MD5哈希值。
 5. **结果输出**:将结果格式化为16进制字符串输出。
 请确保在编译时链接到 `Advapi32.lib` 库,因为CryptoAPI函数在这个库中定义。
 
 
 | 
 |