在不同的操作系统上,hash()函数返回不同的值。

4
当Python内置函数hash()在跨平台时变得很奇怪。我有一个应用程序使用内置的hash()来处理'test'。两个系统都是64位,Python版本为2.7.12。
Windows:
>>> hash('test')
1308370872

Linux:

>>> hash('test')
2314058222102390712

为什么会这样?

当使用hashlib时,一切都很好。是否有任何文档涉及到这种差异? - wiwengweng
1
你是否期望它们返回相同的值?为什么?在同一系统上的不同会话中两次运行 hash("test"),每次返回的值都不同。 - user707650
1
也许一个 Python 是 32 位的,另一个是 64 位的?你可以在 64 位操作系统上运行 32 位的 Python。 - Ella Sharakanski
@donkopotamus 不是的 - Antti Haapala -- Слава Україні
OP明确提到他们正在使用Python 2.7.12。因此,重复问题与Python 3.3无关。重新打开问题。 - thefourtheye
我无法想象你们讨论了这么多,因为我对内置函数一无所知。确实,hashlib解决了我的问题:我需要相同的字符串返回相同的数字序列。谢谢大家。 - wiwengweng
1个回答

4
在Python中,不能保证hash函数的返回值。从你使用32位Windows Python(这只是猜测)以及在Linux上使用64位python中可以看出。如果我没记错(我没有验证),默认情况下hash(item)函数会将item的地址作为其哈希值返回。
如果您想要在不同操作系统之间进行比较,请查看hashlib

我刚刚重新阅读了这个问题;在一个平台上,hash(item)返回item的地址可能会在不同的运行中返回非常不同的值,更不用说在不同的平台上了,无论是32位还是64位的问题。 - cco
更糟糕的是,两个值相等的字符串不一定具有相同的内存地址,但它们需要具有相同的哈希值,否则它们可能会出现在字典键中两次。因此这不可能是解决方案。 - RemcoGerlich
没错,Python通过透明地对字符串进行内部化为我们提供了很多便利,因此hash('foo')可能与xx='foo'; hash(xx)相同或不同。hashlib提供了解决这个问题的方案。 - cco
hashlib完全不受“问题”的影响,因为它根本不关心地址,哈希取决于字符串的值。hash()也是如此。 - RemcoGerlich
1
正确,但是 hash() 不能保证在不同平台上的一致性,而 hashlib 可以。 - cco

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