[英]pickle.dumps compatibility in python2,3
我正在尝试编写一个函数来对所有python对象的md5哈希进行哈希处理。 我想在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() )
1) pickle.dumps
将返回一个字节字符串,因此您的打印错误。
2)如果由于某种原因您在unicode字符串上包含此类内容,则不能将多字节编解码器用作utf-8(默认值)。
foo = '\x80\x02]q\x00(U\x011q\x01K\x02U\x013q\x02K\x04e.'.encode('latin-1')
latin-1
将具有1到1的映射,因此您将得到正确的字节。
PS:为什么要在打印内容中使用列表? 也许您正在寻找print(repr(...))
有一个衬板可以进行2x和3x编码,您可以对任何编码进行编码。
>>> hashlib.new(algorithm, repr(object).encode()).hexdigest()
有关变量名称的完整上下文,请参见: https : //github.com/uqfoundation/klepto/blob/master/klepto/crypto.py#L26…以及有关编码,序列化,等等。 所有工作在python 2.x和3.x中。
我看到您希望python 2.x和3.x返回相同的哈希值。 嗯...我认为那没有用。 如果它有机会或在2.x中返回与在3.x中相同的md5
编码,则可能必须先用repr
或pickle
(协议2)或其他方法打它。
Python 2.7.8 (default, Jul 13 2014, 02:29:54)
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import klepto
>>> klepto.crypto.hash(klepto.crypto.pickle(object), algorithm='md5')
'ee16782749cb00e4b66922df545877f0'
因此,pickle和md5
似乎不起作用,并且通常不应该这样做,因为某些对象已在2.x和3.x之间更改(例如, object
是一个type
现在它是一个class
)。 这也意味着repr
或其他类似的东西通常也不能用作编码器。
Python 3.3.5 (default, Mar 10 2014, 21:37:38)
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import klepto
>>> klepto.crypto.hash(klepto.crypto.pickle(object), algorithm='md5')
'35eb4c374cafe09c8ac01661701b6b6e'
也许klepto
的其他编码器中的一种可以为您工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.