【问题标题】:hash() returning different values on different OSshash() 在不同的操作系统上返回不同的值
【发布时间】:2017-02-20 17:17:11
【问题描述】:

当 python 内置 hash() 只是有线跨平台时。我有一个应用程序使用内置hash()'test'。两个系统都是64位,python 2.7.12

窗口:

>>> hash('test')
1308370872

Linux:

>>> hash('test')
2314058222102390712

这是为什么?

【问题讨论】:

  • 使用 hashlib 时,一切正常。是否有任何文档提到了这种差异?
  • 您希望它们返回相同的值吗?为什么?在同一系统的不同会话中运行hash("test") 两次,每次返回不同的值。
  • 也许一个 python 是 32 位,另一个是 64 位?你可以在 64 位操作系统上运行 python 32 位
  • @donkopotamus nope
  • OP 明确提到他们使用的是 Python 2.7.12。所以欺骗是不相关的,因为它是关于 Python 3.3 的。重新打开问题。

标签: python python-2.7 hash python-internals


【解决方案1】:

无法保证 Python 中的 hash 返回值。看来您使用的是 32 位 Windows Python(这是猜测),并且您在 linux 上使用的是 64 位 Python(再次猜测)。 IIRC(我还没有检查),默认hash(item)返回item的地址作为其哈希值。

如果您想获得可以跨操作系统比较的值,请查看hashlib

【讨论】:

  • 我刚刚重读了这个问题; hash(item) 返回 item 的地址可能会在一个平台上的不同运行之间返回截然不同的值,更不用说在不同的平台上,无论 32/64 位问题如何。
  • 更糟糕的是,两个具有相同值的字符串不一定具有相同的内存地址,但它们需要具有相同的哈希值,否则它们可能会在字典键中出现两次。所以这不可能。
  • 是的。 Python 通过透明地实习字符串为我们带来了很多好处,因此hash('foo') 可以与xx='foo'; hash(xx) 相同或不同。 hashlib 有解决这个问题的办法。
  • hashlib 完全不受“问题”的影响,因为它根本不关心地址,哈希取决于字符串的值。 hash() 也一样。
  • 是的,但是 hash() 不能保证是平台无关的,而 hashlib 是。
猜你喜欢
  • 2021-06-03
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 2014-02-06
  • 2018-10-16
相关资源
最近更新 更多