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.
}