Python 2 vs 3.相同的输入,不同的结果。 MD5哈希

时间:2016-12-09 20:46:04

标签: python python-2.7 python-3.x md5

Python 3代码:

def md5hex(data):
    """ return hex string of md5 of the given string """
    h = MD5.new()
    h.update(data.encode('utf-8'))
    return b2a_hex(h.digest()).decode('utf-8')

Python 2代码:

def md5hex(data):
    """ return hex string of md5 of the given string """
    h = MD5.new()
    h.update(data)
    return b2a_hex(h.digest())

输入python 3:

>>> md5hex('bf5¤7¤8¤3')
'61d91bafe643c282bd7d7af7083c14d6'

输入python 2:

>>> md5hex('bf5¤7¤8¤3')
'46440745dd89d0211de4a72c7cea3720'

怎么回事?

编辑:

def genurlkey(songid, md5origin, mediaver=4, fmt=1):
    """ Calculate the deezer download url given the songid, origin and media+format """
    data = b'\xa4'.join(_.encode("utf-8") for _ in [md5origin, str(fmt), str(songid), str(mediaver)])
    data = b'\xa4'.join([md5hex(data), data])+b'\xa4'
    if len(data)%16:
        data += b'\x00' * (16-len(data)%16)
    return hexaescrypt(data, "jo6aey6haid2Teih").decode('utf-8')

所有这个问题始于另一个函数中python 2代码中的b'\ xa4'。这个字节在python 3中不起作用。

有了那个,我得到了正确的MD5哈希......

2 个答案:

答案 0 :(得分:4)

使用hashlib&与语言无关的实现:

import hashlib
str = u'bf5¤7¤8¤3'
str = str.encode('utf-8')
print(hashlib.md5(str).hexdigest())

在Python 2/3中工作,结果相同:

Python2:

'61d91bafe643c282bd7d7af7083c14d6'

Python3(通过repl.it):

'61d91bafe643c282bd7d7af7083c14d6'

您的代码失败的原因是编码字符串与未编码的字符串相同的字符串:您只是为Python 3编码。

如果你需要它来匹配未编码的Python 2:

import hashlib
str = u'bf5¤7¤8¤3'
print(hashlib.md5(str.encode("latin1")).hexdigest())

工作的:

46440745dd89d0211de4a72c7cea3720

Python 2的默认编码为latin1而不是utf-8

答案 1 :(得分:0)

python3中的默认编码是Unicode。在python 2中它是ASCII。因此,即使字符串在读取时匹配,它们也会以不同的方