如何在Python3中组合哈希码?

凯维纳佩

我对从子类的超类构建复杂/组合的哈希码的“ Java方式”更为熟悉。Python 3是否有更好/不同/首选的方式?(我在Google上找不到关于Python3的任何东西。)

class Superclass:
    def __init__(self, data):
        self.__data = data

    def __hash__(self):
        return hash(self.__data)

class Subclass(Superclass):
    def __init__(self, data, more_data):
        super().__init__(data)
        self.__more_data = more_data

    def __hash__(self):
        # Just a guess...
        return hash(super()) + 31 * hash(self.__more_data)

为了简化这个问题,请假设self.__dataself.__more_data它们是简单的可散列数据,例如strint

汤姆·威格斯

python文档建议您使用xor组合哈希:

唯一需要的属性是比较相等的对象具有相同的哈希值;建议以某种方式将散列值混合在一起(例如,使用异或),以将对象的组成部分也用作对象比较的一部分。

由于以下原因,我还建议在加法和乘法上进行异或运算:

注意

hash()将对象的自定义__hash__()方法返回的值截断为的大小Py_ssize_t在64位版本上通常为8个字节,在32位版本上通常为4个字节。如果对象__hash__()必须在不同位大小的版本上互操作,请确保检查所有受支持版本的宽度。一种简单的方法是使用python -c "import sys; print(sys.hash_info.width)

顺便说一下,此文档与python 2.7和python 3.4相同。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章