我想寫一個函數來md5散列任何python對象。我想在python2和python3中返回相同的md5值。pickle.dumps兼容python2,3
我知道python3中的pickle.dumps,它返回字節,而在python2中,它返回str。正如你可以看到下面的代碼給了我現在同樣的字符串:
print([ pickle.dumps(obj, protocol = 2) ]) # in python2
print([ str(pickle.dumps(obj, protocol = 2)) ]) # in python3
兩個給我:
['\x80\x02]q\x00(U\x011q\x01K\x02U\x013q\x02K\x04e.']
但問題是,在python3:
hashlib.md5.update(some_string)
有被編碼。如果我在python3中編碼字符串,那麼它不會給我與python2中相同的md5值。誰可以給我一個解決方案?感謝你們。
這裏是我的代碼:
from __future__ import print_function
import hashlib
import pickle
import sys
is_py2 = (sys.version_info[0] == 2)
obj = ['1',2,'3',4]
m = hashlib.md5()
if is_py2: # if it's python2
print( [ pickle.dumps(obj, protocol = 2) ])
m.update( pickle.dumps(obj, protocol = 2) )
else: # if it's python3
print( [ str(pickle.dumps(obj, protocol = 2)) ])
m.update( pickle.dumps(obj, protocol = 2).encode("utf-8")) # I wish I could don not encode
print(m.hexdigest())
請你給我的代碼,使對象的MD5值在兩個py2,3相同? – MacSanhe 2014-10-12 12:50:22