为任意对象创建哈希?

mat*_*anm 7 python

我一直在使用pickle.dumps以便为任意Python对象创建哈希,但是,我发现dict/set命令不是规范化的,因此结果是不可靠的.

在SO和其他地方几个 相关的 问题,但我似乎找不到使用相同基础进行相等(/ 结果)的哈希算法.我理解滚动自己的基本要求,但显然我更喜欢使用经过测试的东西.__getstate____dict__

这样的图书馆存在吗?我想我实际要求的是一个确定性地序列化对象的库(使用__getstate____dict__),这样我就可以对输出进行散列.

编辑

为了澄清,我正在寻找与Python hash(或__hash__)返回的值不同的东西.我想要的本质上是任意对象的校验和,可能是也可能不是.该值应根据对象的状态而变化.(我正在使用"状态"来指代由其重新调整的字典,__getstate__或者,如果不存在,则指对象的__dict__.)

mat*_*anm 1

我想到可以扩展 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)