2016-12-09 92 views
1

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

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()) 

输入蟒3:

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

输入蟒2:

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

请告诉我要去Ø N +

编辑:

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') 

这一切问题的开始这个B '\ XA4' 在Python 2的代码在另一个函数。该字节不出现在Python 3

有了这样的一个我得到正确的MD5哈希工作......在python3

+2

您是否尝试过使用'u'前缀字符串? –

+0

@NilsWerner,是的。同样的结果。 –

+0

你用'from __future__ import unicode_literals'试过了吗? – Gribouillis

回答

3

使用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()) 

作品:为Python

46440745dd89d0211de4a72c7cea3720 

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

+0

我编辑与产生“¤”字的问题,我的问题。正确的结果应该是'46440745dd89d0211de4a72c7cea3720'。 –

+0

@EduardoM有没有一些理由是'正确'的结果?只要两者对相同的输入给出相同的结果,散列值应该是不相关的。 – TemporalWolf

+0

就是因为原来的代码在Python 2我声明了编码由于代码返回KeyError异常'类型错误:Unicode的对象必须hashing' 之前被编码在Python 2,正确的,它不是必需的编码。 –

0

默认编码为Unicode。在Python 2中它是ASCII。所以即使字符串在读取时匹配,它们的表现也不同。

+0

有没有解决方法?我需要获得与python 2代码相同的结果。问题是'¤'字符。 –

+0

你有没有在python2源中声明编码? –

+0

我只是把它放在python 3源代码中,因为代码给出了一个TypeError:'TypeError:Unicode-对象必须在散列之前编码' –

相关问题