Python hash()不能处理长整数?
我定义了一个类:
class A:
''' hash test class
>>> a = A(9, 1196833379, 1, 1773396906)
>>> hash(a)
-340004569
This is weird, 12544897317L expected.
'''
def __init__(self, a, b, c, d):
self.a = a
self.b = b
self.c = c
self.d = d
def __hash__(self):
return self.a * self.b + self.c * self.d
为什么在doctest中,hash()函数给出了一个负整数?
它似乎仅限于32位。 通过阅读这个问题,看起来你的代码可能在64位机器上产生了预期的结果(具有这些特定值,因为结果适合于64位)。
内置hash函数的结果是平台相关的,并受到本机字大小的限制。 如果您需要确定性的跨平台哈希,请考虑使用hashlib模块。
查看object.__hash__
注意到
在版本2.5中更改: __hash__()现在也可以返回一个长整数对象; 然后从该对象的哈希中导出32位整数。
在你的情况下,预期12544897317L是一个长整数对象,
Python通过(12544897317 & 0xFFFFFFFF) - (1<<32)导出了32位整数-340004569,
Python通过散列(12544897317L)导出32位整数,结果为-340004569
算法是这样的:
def s32(x):
x = x & ((1<<32)-1)
if x & (1<<31):
return x - (1<<32)
else:
return x
def hash(x):
h = 0
while x:
h += s32(x)
x >>= 32
return h
因为散列函数的目的是获取一组输入并将它们分布在一系列键上,所以这些键不得不是正整数。
pythons散列函数返回负整数的事实只是一个实现细节,并且必然限于长整数。 例如,哈希('abc')在我的系统上为负数。
链接地址: http://www.djcxy.com/p/53623.html