【发布时间】:2013-02-12 03:13:18
【问题描述】:
我正在研究一个 C++ 类,我们正在学习 MD5 散列函数。但是,我遇到了这个问题,我在其中执行以下操作:
string input = "testInput";
unsigned char *toHash = new unsigned char[input.size()+1];
strcpy( (char*)toHash, input.c_str() );
unsigned char output[MD5_DIGEST_LENGTH];
MD5(toHash, input.size(), output);
cout << hex << output << endl;
但我总是得到一些奇怪的垃圾字符,而不是我正在寻找的东西,比如一长串数字/字母。怎么回事?
~ 被低级 C++ 搞糊涂了
【问题讨论】:
-
哈希函数生成包含哈希的二进制字符串;您需要将其转换为十六进制或您想使用的任何其他表示形式。
-
那个“垃圾”也被称为 md5 摘要。 :-)
-
所以,一些字符将是控制字符(0x00..0x1F,0x7F..0x9F);任何空字节都将“空终止”您的“字符串”。一些字符将是 ASCII(假设是普通代码集,例如 CP1252 或 8859-1),其余字符将是重音字符或其他特殊标点符号等。无论哪种方式,它看起来都像“垃圾”。您需要分别打印每个字节,可能是 2 个十六进制数字。
-
@user1288167,它们被解释为无符号字符。您认为某些角色是“垃圾”的事实是无关紧要的。您实际上希望输出是什么?一个十六进制数字序列?
-
@user1288167 MD5 哈希是源数据的二进制摘要。如果您希望它是十六进制字符串形式,则将每个字节转换为一对 alpha 字符('0'..9,'A'..'F')并将它们存储在一个字符串中。