2016-05-15 3 views
2

Ниже выполняется на Python 2.4 и производит следующий хэш: a1e48607773b80c62b80af2b6358c4faPython hashlib MD5 непоследовательность от Python 2.x до Python 3?

#!/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 
Смежные вопросы