2016-05-15 66 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