2015-12-03 45 views
5

我正在练习元组哈希。在那里我正在研究Python 2.7。下面是代码:在Python中哈希元组导致不同系统中的不同结果

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

上面的代码导致

>>> 2 
>>> 1 2 
>>> 3713081631934410656 

但在我的本地PC,我使用其中的Python 3.4的答复是

>>> 1299869600 

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

+0

我试着用不同的机器上的许多不同的2.x版本的散列。它显示了相同的结果。虽然不同版本的python3.x显示不同的结果。 –

回答

1

hash()可能为不同的操作系统,体系结构,Python实现和Python版本上的同一对象返回不同的值。

它被设计为仅在单个Python会话中使用,而不是跨会话或机器使用。因此,除此之外,您绝不应该依赖hash()的值。

如果您需要哈希能产生相同的结果无处不在,考虑校验如:

  • MD5或SHA-1,
  • xxHash其中每它的作者提供跨多个操作系统和架构稳定的结果,无论是小或大端,32/64位,posix与否等)
  • 或谨慎小心某些版本可能在不同的体系结构上产生不同的结果。例如,当我将C Murmur2移植到IBM S390 Linux安装(所有奇怪的地方!)时,我经历了这一拳头。为了避免出现问题,我终于在该OS上编写了一个缓慢而独立于脚本的纯Python实现,而不是C实现。
+1

简评xxHash是不正确的:结果是跨多个不同的操作系统和架构稳定,无论是很少或大端,32/64位,POSIX与否等 – Cyan

+1

@cyan你是正确的,并具有xxHash的作者,我必须感谢你在++中提到:我在过去碰到了排序问题时,“加了一些小心”。举例来说,当我将C Murmur移植到IBM S390 Linux安装(所有奇怪的地方!)时,我经历了这一拳头。为了避免出现问题,我终于在该OS上编写了一个缓慢而独立于脚本的纯Python实现,而不是C实现。 –

相关问题