在不同系统中使用Python哈希元组会导致不同的结果

7

我正在练习元组哈希。我使用的是Python 2.7版本。以下是代码:

num = int(raw_input())
num_list = [int(x) for x in raw_input().split()]
print(hash(tuple(num_list)))

上述代码的结果是:
>>> 2
>>> 1 2
>>> 3713081631934410656

但在我本地使用Python 3.4的电脑上,答案是
>>> 1299869600

代码已被接受,但我无法找出导致不同结果的原因。这是因为Python的不同版本吗?


我现在尝试了许多不同的2.x版本哈希算法在不同的机器上,结果都是一样的。而不同版本的python3.x则会显示不同的结果。 - Akshay Hazari
1个回答

1
hash() 可能会在不同的操作系统、架构、Python 实现和 Python 版本中返回相同对象的不同值。
它仅设计用于单个 Python 会话内部使用,不适用于跨会话或机器。因此,您永远不应该依赖 hash() 的值超出这个范围。
如果您需要在任何地方都产生相同结果的哈希,请考虑使用校验和,例如:
  • MD5 或 SHA1
  • xxHash,其作者提供了稳定的结果,可在多个操作系统和架构上使用,无论是小端还是大端,32/64 位,posix 还是非 posix 等。
  • 或者谨慎使用 Murmur,因为某些版本可能在不同的架构上产生不同的结果。例如,当将 C Murmur2 移植到 IBM S390 Linux 安装时(所有奇怪的地方!),我亲身经历了这一点。为避免问题,我最终在该操作系统上编写了一个慢但与体系结构无关的纯 Python 实现,而不是 C 实现。

1
对于xxHash的评论是不正确的:结果在多个不同的操作系统和架构上都是稳定的,无论是小端还是大端、32/64位、posix或非posix等。 - Cyan
1
@cyan 你说得对,作为xxHash的作者,我必须感谢你的参与:我加入了“小心谨慎”的提示,因为我过去曾遇到过字节序问题。例如,当我将一个C Murmur移植到IBM S390 Linux安装时(在所有奇怪的地方中!),我亲身经历了这个问题。为了避免问题,我最终选择在该操作系统上编写了一个慢但与架构无关的纯Python实现,而不是C实现。 - Philippe Ombredanne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接