|
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函数在这个库中定义。
|
|