我需要比较两个字符串的哈希值。 我使用字符串“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;
}
例如hHash1中的哈希值
691136
hHash2中的哈希值
691216
答案 0 :(得分:4)
HCRPTHASH
是ULONG_PTR
typedef。这意味着它是一个指针:
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);
}
为了比较两个哈希值,你可以这样做:
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.
}
答案 1 :(得分:2)
hHash1和hHash2不是哈希码,而是句柄。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa379908(v=vs.85).aspx
答案 2 :(得分:1)
正如其他答案所指出的那样,hHash1
和hHash2
是不透明的句柄 - 比较它们是没有意义的,因为它类似于比较具有相同值的两个不同对象的地址。
使用CryptGetHashParam
获取哈希值并进行比较:
CryptGetHashParam
函数检索管理哈希对象操作的数据。 可以使用此函数检索实际哈希值。