我对从子类的超类构建复杂/组合的哈希码的“ 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.__data
且self.__more_data
它们是简单的可散列数据,例如str
或int
。
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] 删除。
我来说两句