什么是正确的好方法__hash__()?我说的是一个返回哈希码的函数,然后该哈希码用于将对象插入哈希表(又名字典)。作为__hash__()返回的整数,并用于将对象“绑定”到哈希表中,我假设返回的整数的值应均匀分配给公共数据(以最大程度地减少冲突)。获得这样的价值的最佳实践是什么?碰撞是个问题吗?在我的情况下,我有一个小类,它充当包含一些整数,一些浮点数和一个字符串的容器类。
3 回答
暮色呼如
TA贡献1853条经验 获得超9个赞
一种简单而正确的实现方法__hash__()是使用键元组。它不会像专门的哈希那样快,但是如果需要,则应该在C中实现该类型。
这是使用键进行哈希和相等的示例:
class A:
def __key(self):
return (self.attr_a, self.attr_b, self.attr_c)
def __hash__(self):
return hash(self.__key())
def __eq__(self, other):
if isinstance(other, A):
return self.__key() == other.__key()
return NotImplemented
此外,的文档__hash__还包含更多信息,这些信息在某些特定情况下可能会很有价值。
饮歌长啸
TA贡献1951条经验 获得超3个赞
Microsoft Research的Paul Larson研究了各种哈希函数。他告诉我
for c in some_string:
hash = 101 * hash + ord(c)
对于各种各样的琴弦,效果都非常好。我发现类似的多项式技术可以很好地用于计算不同子字段的哈希。
添加回答
举报
0/150
提交
取消