2016-12-09 126 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-對象必須在散列之前編碼' –

相關問題