2016-05-15 62 views
2

正在有關python 2.4運行以下併產生下列散列:a1e48607773b80c62b80af2b6358c4faPython hashlib從Python 2.x到Python 3的MD5不一致?

#!/usr/bin/python 
import md5 
id=76561198302409766 
temp = "" 
for i in range(8): 
     temp += chr((id & 0xFF)) 
     id >>= 8 
m = md5.new("BE"+temp) 
print m.hexdigest() 

這是Python 3的轉換後的代碼:

#!/usr/local/bin/python3.3 -B 
import hashlib 
id = 76561198302409766 
print ("Python 2.4 output: a1e48607773b80c62b80af2b6358c4fa") 
m = hashlib.md5() 
temp = "" 
for i in range(8): 
    temp += chr((id & 0xFF)) 
    id >>= 8 
m.update("BE".encode('utf-8')+temp.encode('utf-8')) 
print ("%s" % m.hexdigest()) 

這產生一個完全不同的哈希值。我能做些什麼來修復它,使它產生與前面的腳本相同的散列?

+0

這兩個代碼都沒有的方式相同。你正在編碼'temp'。 – ozgur

回答

2

正確轉換。

import hashlib 
id = 76561198302409766 
print ("Python 2.4 output: a1e48607773b80c62b80af2b6358c4fa") 
m = hashlib.md5() 
temp = bytearray() 
for i in range(8): 
    temp.append(id & 0xFF) 
    id >>= 8 
m.update(b"BE" + temp) 
print ("%s" % m.hexdigest()) 

...

$ python3 hash.py 
Python 2.4 output: a1e48607773b80c62b80af2b6358c4fa 
a1e48607773b80c62b80af2b6358c4fa 

還是在第一時間正確地寫。

import hashlib 
import struct 

id = 76561198302409766 
print ("Python 2.4 output: a1e48607773b80c62b80af2b6358c4fa") 
m = hashlib.md5() 
temp = struct.pack('<Q', id) 
m.update(b"BE" + temp) 
print ("%s" % m.hexdigest()) 

...

$ python2 hash2.py 
Python 2.4 output: a1e48607773b80c62b80af2b6358c4fa 
a1e48607773b80c62b80af2b6358c4fa 
$ python3 hash2.py 
Python 2.4 output: a1e48607773b80c62b80af2b6358c4fa 
a1e48607773b80c62b80af2b6358c4fa