这个问题在这里已经有答案了:
什么';这是实现_hash__()的正确而好的方法吗?
(7个答案)
(7个答案)
两年前关闭的
当实现具有多个属性的类(如下面的玩具示例)时,处理哈希的最佳方法是什么
我想\uuuuuueq\uuuuu和\uuuuhash\uuuuuu应该是一致的,但是如何实现一个能够处理所有属性的适当的hash函数呢
类AClass:
定义初始化(自):
self.a=无
self.b=无
定义(自身、其他):
返回other和self.a==other.a和self.b==other.b
定义(自身、其他):
返回非自我。均衡(其他)
定义散列(自我):
返回散列((self.a,self.b))
我在这个问题上读到元组是可散列的,所以我想知道上面的例子是否合理。是吗
\uuuuuuuuuuuuuuuuuu散列应为相等的对象返回相同的值。它也不应该在对象的生命周期内改变;通常,您只为不可变对象实现它
一个简单的实现就是返回0。这总是正确的,但表现很差
您的解决方案是返回属性元组的哈希值,这很好。但是请注意,您不需要在元组中列出在\uuuueq\uuuu中比较的所有属性。如果某些属性对于不相等的对象通常具有相同的值,只需将其忽略即可。不要让散列计算变得比需要的更昂贵
编辑:我建议一般不要使用xor来混合散列。当两个不同的属性具有相同的值时,它们将具有相同的散列,使用xor,它们将相互抵消。元组使用更复杂的计算来混合散列,请参见tupleobject.c中的tuplehash