我需要比较两个字符串的哈希值。我使用字符串“template”进行测试。但我得到了这个字符串的不同哈希值,所以它总是不一样。我使用 CryptoApi 和 MD4
int _tmain(int argc, _TCHAR* argv[])
{
std::hash_map<int,int> table;
HCRYPTPROV hProv1,hProv2;
BYTE *pbBuffer1=(BYTE*)"template";//data to hash
DWORD dwBufferLen1=strlen((char*)pbBuffer1)+1;
HCRYPTHASH hHash1,hHash2;
//first hash
CryptAcquireContext(&hProv1,NULL,NULL,PROV_RSA_AES,0);
CryptCreateHash(hProv1,CALG_MD4,0,0,&hHash1);
CryptHashData(hHash1,pbBuffer1,dwBufferLen1,0);
/*---------*/
BYTE *pbBuffer2=(BYTE*)"template";//data to hash
DWORD dwBufferLen2=strlen((char*)pbBuffer2)+1;
//second hash
CryptAcquireContext(&hProv2,NULL,NULL,PROV_RSA_AES,0);
CryptCreateHash(hProv2,CALG_MD4,0,0,&hHash2);
CryptHashData(hHash2,pbBuffer2,dwBufferLen2,0);
if (hHash1==hHash2)
printf("The Same\n");
else printf("Not same\n");
/*---------*/
std::cout<<hHash1<<std::endl;
std::cout<<hHash2<<std::endl;
if (hProv1)
CryptReleaseContext(hProv1,0);
if (hProv2)
CryptReleaseContext(hProv2,0);
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
例如hHash1中的哈希值
691136
Run Code Online (Sandbox Code Playgroud)
hHash2 中的哈希值
691216
Run Code Online (Sandbox Code Playgroud)
HCRPTHASH是一个ULONG_PTRtypedef,按照这里。这意味着它是一个指针:
数据
HCRYPTHASH类型用于表示哈希对象的句柄。这些句柄向 CSP 模块指示特定操作中正在使用哪个哈希。CSP 模块无法直接操作哈希值。相反,用户通过哈希句柄来操作哈希值。
typedef ULONG_PTR HCRYPTHASH;
比较指针与==将果冻(或美国公民的果冻)钉在树上或尝试训练猫一样有效:-)
您看到的“散列”值实际上是指针,相距 80 个字节(因为它们是指向两个不同内存块的指针)。
为了从句柄中获取实际的哈希值,您需要类似以下内容的内容,它会打印十六进制数字:
CHAR hexDigits[] = "0123456789abcdef";
BYTE md4Hash[MD4LEN];
DWORD cbHash = MD4LEN;
if (CryptGetHashParam (hHash1, HP_HASHVAL, md4Hash, &cbHash, 0)) {
printf("MD4 hash is: ");
for (DWORD i = 0; i < cbHash; i++) {
printf ("%c%c", hexDigits[md4Hash[i] >> 4], hexDigits[md4Hash[i] & 0xf]);
}
printf("\n");
} else {
DWORD dwStatus = GetLastError();
printf ("CryptGetHashParam failed with code %d\n", dwStatus);
}
Run Code Online (Sandbox Code Playgroud)
要比较两个哈希值,您可以执行以下操作:
BYTE md4Hash1[MD4LEN], md4Hash2[MD4LEN];
DWORD cbHash1 = MD4LEN, cbHash2 = MD4LEN;
CryptGetHashParam (hHash1, HP_HASHVAL, md4Hash1, &cbHash1, 0);
CryptGetHashParam (hHash2, HP_HASHVAL, md4Hash2, &cbHash2, 0);
if ((cbHash1 == cbHash2) &&
(memcmp (md4Hash1, md4Hash2, cbHash1) == 0))
{
// they are equal.
}
Run Code Online (Sandbox Code Playgroud)