我想写一个函数来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