为什么这段代码在 Python 和 Pypy3 中给出不同的结果?

问题描述 投票:0回答:2

给定一个整数 n 和 n 个空格分隔的整数作为输入,创建一个由这 n 个整数组成的元组 t。然后计算并打印 hash(t) 的结果。

在 Python 3 中,与 Pypy3 相比,这给出了不同的输出。那么为什么相同的逻辑会给出两种不同的结果呢?

n = int(input())
print(hash(tuple(map(int, input().split()))))

我的输出:

-3550055125485641917

预期输出:

3713081631934410656
python-3.x hash tuples pypy
2个回答
1
投票

简短回答:您认为

hash()
值应该相同的假设是错误的。

hash()
值用于散列,例如当您将某些内容作为字典中的键时

哈希是特定于实现的,哈希函数的值对用户没有任何意义。唯一的保证是在同一个Python运行进程中,两个相等的对象应该具有相同的哈希值。值可能不仅在不同的Python版本之间不同,而且如果多次运行程序,或者不同的Python实现,或者不同的CPU架构等,相同的Python版本也会不同。


0
投票

原因是因为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)
© www.soinside.com 2019 - 2024. All rights reserved.