我正在尝试编写一个函数来 md5 散列任何 python 对象。我想在 python2 和 python3 中返回相同的 md5 值。
我知道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() )