V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Ncer
V2EX  ›  Python

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

  •  
  •   Ncer · 2015-05-26 22:26:43 +08:00 · 1890 次点击
    这是一个创建于 3470 天前的主题,其中的信息可能已经有所发展或是发生改变。
    gn· ¿EA{3©äI„Ǐ

    在js里的md5是A0CD14864210672C734FC35F3AC3241A

    在py里的md5是F1C4BBE3336C7CB5C902FCEF8878888B

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

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

    有没有不这么蛋疼的办法呢
    4 条回复    2015-05-27 23:29:45 +08:00
    mengzhuo
        1
    mengzhuo  
       2015-05-26 23:17:11 +08:00   ❤️ 1
    看encoding都是utf8 么
    不是的话,全部转成utf8
    Ncer
        2
    Ncer  
    OP
       2015-05-26 23:51:31 +08:00
    @mengzhuo
    py3里,gn· ¿EA{3©äI„Ǐ 是str型的
    在hashlib.md5()的参数必须是bytes,所以传入参数的时候已经encode('utf-8')过了
    Sylv
        3
    Sylv  
       2015-05-27 18:59:06 +08:00   ❤️ 1
    话说我怎么都没法从你发的 "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
        4
    Ncer  
    OP
       2015-05-27 23:29:45 +08:00
    @Sylv 可能复制过来其中的编码又有问题了,我md5 这个页面上的那个字符串也是你的结果。

    问题解决了。

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

    原理还不是很懂,编码问题真是蛋疼
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5681 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 09:02 · PVG 17:02 · LAX 01:02 · JFK 04:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.