为了账号安全,请及时绑定邮箱和手机立即绑定

什么是实现__hash __()的正确和好方法?

什么是实现__hash __()的正确和好方法?

千巷猫影 2019-10-15 14:53:20
什么是正确的好方法__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__还包含更多信息,这些信息在某些特定情况下可能会很有价值。


查看完整回答
反对 回复 2019-10-15
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

Microsoft Research的Paul Larson研究了各种哈希函数。他告诉我


for c in some_string:

    hash = 101 * hash  +  ord(c)

对于各种各样的琴弦,效果都非常好。我发现类似的多项式技术可以很好地用于计算不同子字段的哈希。


查看完整回答
反对 回复 2019-10-15
  • 3 回答
  • 0 关注
  • 909 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信