调用微信接口发消息,开始用python2 遇到编码问题折腾好久都没能搞定,就干脆换成Python3。

然后就遇到了python3 和python2,用hashlib同样的代码给,sha1的结果不一样。

哪位大神帮忙看看什么原因

1 1 收藏


直接登录
最新评论
  • itismz game tester 2016/10/21

    图挂了

    • 疯狂的兔子 python 2016/10/21

      这么短命。。。早上是好的。

      import hashlib

      list=[‘aaa’,’bbbbb’,’ccccc’]

      list.sort()

      sha1=hashlib.sha1()

      map(sha1.update,list)

      sha1.hexdigest()

       

      在Python2和Python3里得到的结果不一样

       

  • dwangel Java 2016/10/23

    把字符串都转成二进制数组然后看看有啥差别

    • 疯狂的兔子 python 2016/10/24

      现在解决了,看到别人代码里有种写法是先把排序后的字符串拼接,然后再sha1,结果就对了,原因还没搞清楚

  • jackyspy   2016/10/27

    我估计你在Python3下面得到的结果是

    da39a3ee5e6b4b0d3255bfef95601890afd80709

    为什么?我来告诉你原因吧。py2中map返回list,py3中map返回iterator。也就是说在py3中你调用了map,并没有iter()它,你的sha1.update()并没有执行。于是你得到的只是空字符串”的SHA1值。

    把那一行代码改成

    就可以得到和py2下相同的结果。

     

    最后不得不吐槽一下,你用 list 关键字 作为变量名几个意思?

    • 疯狂的兔子 python 2016/10/27

      试过了确实是你说的原因,但是那行改成你写的这样会报一个错误

      TypeError: Unicode-objects must be encoded before hashing

      list不是关键字吧,关键字列表里没有它啊

    • 疯狂的兔子 python 2016/10/27

      额,原来list是转换类型的时候用的,看到好多网上搜出来的代码都用list做变量名,以为不在关键字列表里就没关系呢

    • 疯狂的兔子 python 2016/10/27

      找到原因了,是因为sha1.update接受的参数必须是编码之后字节码,list中直接取出的是Unicode,所以结果是空字符串的sha1值

      • jackyspy   2016/10/28

        是的,我忘了说

        实际上原来的代码在py3下就有这两个问题,一是传入unicode而不是byte,二是map没有iter