给定一个整数 n 和 n 个空格分隔的整数作为输入,创建一个由这 n 个整数组成的元组 t。然后计算并打印 hash(t) 的结果。
在 Python 3 中,与 Pypy3 相比,这给出了不同的输出。那么为什么相同的逻辑会给出两种不同的结果呢?
n = int(input())
print(hash(tuple(map(int, input().split()))))
我的输出:
-3550055125485641917
预期输出:
3713081631934410656
简短回答:您认为
hash()
值应该相同的假设是错误的。
hash()
值用于散列,例如当您将某些内容作为字典中的键时。
哈希是特定于实现的,哈希函数的值对用户没有任何意义。唯一的保证是在同一个Python运行进程中,两个相等的对象应该具有相同的哈希值。值可能不仅在不同的Python版本之间不同,而且如果多次运行程序,或者不同的Python实现,或者不同的CPU架构等,相同的Python版本也会不同。
原因是因为Pypy3使用算法
siphash24
,而python3使用siphash13
。您可以使用以下命令查看差异:
import sys
print(sys.hash_info)
例如,在我的系统中,Pypy3 的值为:
(width=64, modulus=2305843009213693951, inf=314159, nan=0, imag=1000003, algorithm='siphash24', hash_bits=64, seed_bits=128, cutoff=0)
对于 python3:
(width=64, modulus=2305843009213693951, inf=314159, nan=0, imag=1000003, algorithm='siphash13', hash_bits=64, seed_bits=128, cutoff=0)