gpt4 book ai didi

python - 为任意对象创建哈希?

转载 作者:太空狗 更新时间:2023-10-29 21:58:48 26 4
gpt4 key购买 nike

我一直在使用 pickle.dumps 为任意 Python 对象创建哈希,但是,我发现 dict/set 订单没有规范化,结果是因此不可靠。

several related questions在 SO 和 elsewhere 上,但我似乎找不到使用相同基础的哈希算法(__getstate__/__dict__ 结果)。我了解自己滚动的基本要求,但显然我更愿意使用经过测试的东西。

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

编辑

澄清一下,我正在寻找不同于 Python 的 hash 返回值的东西(或 __hash__ )。我想要的本质上是任意对象的校验和,这些对象可能是可哈希的,也可能不是可哈希的。该值应根据对象的状态而变化。 (我使用“state”来指代由 __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

关于python - 为任意对象创建哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16157835/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com