我一直在使用pickle.dumps
为任意Python对象创建散列,但是,我发现dict/set顺序没有规范化,因此结果不可靠。在
在SO和elsewhere上有severalrelatedquestions,但我似乎找不到一个哈希算法,它使用相同的等式基础(__getstate__
/__dict__
结果)。我了解自己滚动的基本要求,但显然我更喜欢使用经过测试的东西。在
这样的图书馆存在吗?我想我实际需要的是一个库,它确定地序列化对象(使用__getstate__
和__dict__
),这样我就可以散列输出。在
编辑
为了澄清这一点,我在寻找与Python的^{__getstate__
返回的dict,如果不存在,则是对象的__dict__
。)
我假设一旦计算(并存储)了对象的散列值,就将对象视为不可变的。否则,你应该对你正在做的事情非常小心(例如,不应该使用它们的散列性来将它们存储在集合、dict等中)。在
也就是说,最优雅的方法是首先将对象的
__dict__
中的所有成员存储为散列类型。不用list
s,使用元组(当然是散列对象)。不要使用dict
s,而是使用this问题的任何解决方案作为散列dict类型(我个人使用的是@alex)。同样,键和值都必须是散列的,这样才能工作。在然后,您的
__hash__
方法可以使用与您使用的相同的散列dict,例如:我突然想到,Pickler可以被扩展,select函数也可以被重写以规范化必要的类型,所以这就是我要做的。下面是它的样子:
相关问题 更多 >
编程相关推荐