我一直在使用pickle.dumps
然而,为了为任意 Python 对象创建哈希,我发现 dict/set 顺序未规范化,因此结果不可靠。
有several related 问题上 SO 和别处,但我似乎找不到使用相同的相等基础的哈希算法(__getstate__
/__dict__
结果)。我了解自己推出的基本要求,但显然我更喜欢使用经过测试的东西。
这样的图书馆存在吗?我想我实际上要求的是一个确定性地序列化对象的库(使用__getstate__
and __dict__
)这样我就可以对输出进行哈希处理。
EDIT
为了澄清一下,我正在寻找与 Python 返回的值不同的东西hash (or __hash__)。我想要的本质上是任意对象的校验和,这些对象可能是可散列的,也可能不是可散列的。该值应根据对象的状态而变化。 (我使用“状态”来指代由__getstate__
或者,如果不存在,则该对象的__dict__
.)
我想到可以扩展 Pickler 并覆盖选择函数以规范化必要的类型,所以这就是我正在做的事情。它看起来是这样的:
from copy import copy
from pickle import Pickler, MARK, DICT
from types import DictionaryType
class CanonicalizingPickler(Pickler):
dispatch = copy(Pickler.dispatch)
def save_set(self, obj):
rv = obj.__reduce_ex__(0)
rv = (rv[0], (sorted(rv[1][0]),), rv[2])
self.save_reduce(obj=obj, *rv)
dispatch[set] = save_set
def save_dict(self, obj):
write = self.write
write(MARK + DICT)
self.memoize(obj)
self._batch_setitems(sorted(obj.iteritems()))
dispatch[DictionaryType] = save_dict
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)