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
以下是 运行 在 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