获取文件HASH算法

本文介绍了一个使用C++实现的文件哈希值计算程序,通过MD5算法为指定文件生成哈希值,并展示了如何分块读取大文件进行哈希计算以避免内存溢出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <Windows.h>
#include <string>
#include <strsafe.h>
#include <AtlConv.h>


BOOL PreprocessDatFile(WCHAR* wzFileName, WCHAR* wzFileHash)
{
USES_CONVERSION;
BOOL bRet = FALSE;
HCRYPTPROV hCryptProv = 0;
HCRYPTHASH hHash = 0;
HANDLE hMapFile = 0;
WCHAR *lpFileHash = NULL;


BYTE bHash[0x7f];
DWORD dwHashLen= 16;
BYTE* pBuf;
std::string digest;
DWORD dwFileSize = 0, dwHighFileSize = 0;


HANDLE hFile = CreateFile(wzFileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
if( hFile == INVALID_HANDLE_VALUE )
{
return FALSE;
}


dwFileSize = GetFileSize(hFile, &dwHighFileSize);


hMapFile = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);


if (hMapFile == NULL || hMapFile == INVALID_HANDLE_VALUE)
{
goto release;
}


if(CryptAcquireContext(&hCryptProv,NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET))
{
if(CryptCreateHash(hCryptProv,CALG_MD5,0, 0, &hHash))
{
UINT64 filesize = (UINT64)dwHighFileSize << 32 | dwFileSize;
for(UINT64 i = 0; i <= filesize; i+=1048576)// 1024*1024
{
size_t bufsize = size_t(min(filesize-i, 1048576));
pBuf = (BYTE*) MapViewOfFile(hMapFile, FILE_MAP_READ, (DWORD)(i >> 32), (DWORD)i, bufsize);


if (pBuf == NULL)
{
goto release;
}


if(!CryptHashData(hHash, pBuf, bufsize, 0))
{
goto release;
}
UnmapViewOfFile(pBuf);
}
if(CryptGetHashParam(hHash, HP_HASHVAL, bHash, &dwHashLen, 0))
{
digest.resize(32);
BYTE value;
for (int i = 0; i<16; i++)
{
value = bHash[i] >> 4;
digest[i*2] = value < 10 ? char(value + '0') : char(value - 10 + 'a');
value = bHash[i] & 0x0F;
digest[i*2+1] = value < 10 ? char(value + '0') : char(value - 10 + 'a');
}
lpFileHash = A2T(digest.c_str());
StringCbPrintfW(wzFileHash, MAX_PATH, L"%s", lpFileHash);
bRet = TRUE;
}
}
}


release:
if(hHash)
CryptDestroyHash(hHash);
if(hCryptProv)
CryptReleaseContext(hCryptProv, 0);
if(pBuf)
UnmapViewOfFile(pBuf);
if(hMapFile)
CloseHandle(hMapFile);
if(hFile)
CloseHandle(hFile);
return bRet;
}


int main()
{
WCHAR wzFile1Hash[MAX_PATH] = { 0 };
WCHAR wzFile2Hash[MAX_PATH] = { 0 };


PreprocessDatFile(L"C:\\calc.exe", wzFile1Hash);


PreprocessDatFile(L"C:\\notepad.exe", wzFile2Hash);


wprintf(L"%s\n%s\n", wzFile1Hash, wzFile2Hash);


getchar();


return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值