我正在尝试将一些链编码为MD5,但我注意到:
连锁店:"123456çñ“
有些网站就像
http://www.md5.net
www.md5.cz
md5generator.net
return:"66f561bb6b68372213dd9768e55e1002“
还有其他的,比如:
http://www.adamek.biz/md5-generator.php
7thspace.com/webmaster_tools/online_md5_encoder.html
md5.rednoize.com/
return:"9e6c9a1eeb5e00fbf4a2cd6519e0cfcb“
我需要用标准md5对链进行编码,因为我需要将我的结果与其他系统连接起来。哪个散列是正确的?
提前感谢
发布于 2011-07-27 14:01:23
我猜问题出在不同的文本编码中。您显示的字符串不能用ANSI编码表示-它需要UTF-16或UTF-8。选择后者之一会导致字符串的字节表示不同,从而产生不同的散列。
请记住,MD5散列字节,而不是字符-在将字节提供给MD5之前,如何将这些字符编码为字节取决于您。如果您希望与其他系统进行互操作,则必须使用与这些系统相同的编码。
发布于 2011-07-27 14:03:30
让我们使用Python来理解这一点。
>>> '123456çñ'
'123456\xc3\xa7\xc3\xb1'
>>> 'ç'
'\xc3\xa7'
>>> 'ñ'
'\xc3\xb1'
在上面的输出中,我们看到了'ç‘和'ñ’的UTF-8编码。
>>> md5('123456çñ').digest().encode('hex')
'66f561bb6b68372213dd9768e55e1002'
因此,当我们计算UTF8编码数据的MD5散列时,我们得到了第一个结果。
>>> u'ç'
u'\xe7'
>>> u'ñ'
u'\xf1'
在这里,我们看到了Unicode代码点“ç”和“ñ”。
>>> md5('123456\xe7\xf1').digest().encode('hex')
'9e6c9a1eeb5e00fbf4a2cd6519e0cfcb'
因此,当我们计算用字符串中每个字符(可能是MD5 -8859-1编码)的Unicode代码点表示的数据的ISO时,我们得到第二个结果。
因此,第一个网站正在计算UTF-8编码数据的哈希值,而第二个网站则不是。
发布于 2011-07-27 14:08:33
如果我尝试:
echo "123456çñ<br />";
echo "utf-8 : ".md5("123456çñ")."<br />";
echo "ISO-8859-1 : ".md5(iconv("UTF-8", "ISO-8859-1","123456çñ"))."<br />";
它给出了结果:
123456çñ
utf-8 : 66f561bb6b68372213dd9768e55e1002
ISO-8859-1 : 9e6c9a1eeb5e00fbf4a2cd6519e0cfcb
第一个网站将字符串编码为ISO-8859-1,第二个网站为UTF-8。
https://stackoverflow.com/questions/6839969
复制相似问题