遇到一些奇怪的字符串,在 py 里 md5 后的值和用 js 的 md5 不一样要如何解决?

2015-05-26 22:26:43 +08:00
 Ncer
gn· ¿EA{3©äI„Ǐ

在js里的md5是A0CD14864210672C734FC35F3AC3241A

在py里的md5是F1C4BBE3336C7CB5C902FCEF8878888B

在各个在线md5加密的网站测试,有的和js一样,有的和py一样,有的另成一派……

所以这个问题就很郁闷了,现在我的解决办法是在本地写一个网页,调用md5.js
……然后向那网页发起请求来获得md5……

有没有不这么蛋疼的办法呢
1889 次点击
所在节点    Python
4 条回复
mengzhuo
2015-05-26 23:17:11 +08:00
看encoding都是utf8 么
不是的话,全部转成utf8
Ncer
2015-05-26 23:51:31 +08:00
@mengzhuo
py3里,gn· ¿EA{3©äI„Ǐ 是str型的
在hashlib.md5()的参数必须是bytes,所以传入参数的时候已经encode('utf-8')过了
Sylv
2015-05-27 18:59:06 +08:00
话说我怎么都没法从你发的 "gn· ¿EA{3©äI„Ǐ " 得到你说的两个 md5 结果,我得到的是 7f5b83f8d5a7a809928bffa0197381f8。

我猜可能是 Unicode 的等价性问题导致的。
例如下面虽然字符 ä 的样子都一样,但 Unicode 码点是不同的,所以编码成 utf-8 的 bytes 序列也会是不同的:

>>> u"ä"
u'\xe4'
>>> u"ä".encode('utf-8')
'\xc3\xa4'

>>> u"ä"
u'a\u0308'
>>> u"ä".encode('utf-8')
'a\xcc\x88'

而 u'a\u0308' 可以被 normalize 为 u'\xe4':

>>> import unicodedata
>>> unicodedata.normalize('NFC', u'a\u0308')
u'\xe4'

所以可能是在输入到 Python 或 JavaScript 过程中字符串中的 Unicode 字符被 normalize 过了,导致字符串不等价了,以致于 md5 不等。
Ncer
2015-05-27 23:29:45 +08:00
@Sylv 可能复制过来其中的编码又有问题了,我md5 这个页面上的那个字符串也是你的结果。

问题解决了。

将该字符串用ISO-8859-1 编码为字节流
参考了这里: http://www.regexlab.com/zh/encoding.htm

原理还不是很懂,编码问题真是蛋疼

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/193958

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX