这是我目前的MD5功能。在Windows 8.1上使用时,它总是返回一个值,但是当在Windows 7上运行时,它只返回大约50%的时间值。这对我来说非常特殊。有什么想法吗?
事实证明,win7和win8都很狡猾。显然,对CryptGetHashParam的调用有时会因ERROR_MORE_DATA而失败。
std::string MD5(std::string input)
{
HCRYPTPROV CryptProv;
HCRYPTHASH CryptHash;
BYTE BytesHash[33];//!
DWORD dwHashLen;
std::string final;
if (CryptAcquireContext(&CryptProv,NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET))
{
if (CryptCreateHash(CryptProv, CALG_MD5, 0, 0, &CryptHash))
{
if (CryptHashData(CryptHash, (BYTE*)input.c_str(), input.length(), 0))
{
if (CryptGetHashParam(CryptHash, HP_HASHVAL, BytesHash, &dwHashLen, 0))
{
final.clear();
std::string hexcharset = "0123456789ABCDEF";
for (int j = 0; j < 16; j++)
{
final += hexcharset.substr(((BytesHash[j] >> 4) & 0xF), 1);
final += hexcharset.substr(((BytesHash[j]) & 0x0F), 1);
}
}
}
}
}
CryptDestroyHash(CryptHash);
CryptReleaseContext(CryptProv, 0);
return final;
}
int _tmain(int argc, _TCHAR* argv[])
{
char *pp = "derp";
std::string derp = MD5(std::string(pp));
printf("%s\n", derp.c_str());
system("pause");
return 0;
}
答案 0 :(得分:2)
我有一个很棒的主意:在这些条件中添加else
子句,以便您知道哪一个失败了。将输出放在这些子句中,以便您可以查看错误条件的详细信息。然后你就会知道你的功能有什么问题。