我一直在使用pickle.dumps以便为任意Python对象创建哈希,但是,我发现dict/set命令不是规范化的,因此结果是不可靠的.
在SO和其他地方有几个 相关的 问题,但我似乎找不到使用相同基础进行相等(/ 结果)的哈希算法.我理解滚动自己的基本要求,但显然我更喜欢使用经过测试的东西.__getstate____dict__
这样的图书馆存在吗?我想我实际要求的是一个确定性地序列化对象的库(使用__getstate__和__dict__),这样我就可以对输出进行散列.
编辑
为了澄清,我正在寻找与Python hash(或__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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2212 次 |
| 最近记录: |