Python hashlib MD5 从 Python 2.x 到 Python 不一致 3?

Python hashlib MD5 inconsistency from Python 2.x to Python 3?

以下是 运行 在 python 2.4 上生成的哈希值:a1e48607773b80c62b80af2b6358c4fa

#!/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())

这会产生一个完全不同的散列。我该怎么做才能修复它,使其生成与之前脚本相同的哈希值?

正确转换。

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