2016-05-15 22 views
2

のpython 2.4上で実行され、次の、次のハッシュ値を生成します。a1e48607773b80c62b80af2b6358c4faPython 2.xからPython 3へのPython hashlib 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

これらの2つのコードを経由して同じではありません。あなたは '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