【问题标题】:How does Python 2.7.3 hash strings used to seed random number generators?Python 2.7.3 如何使用散列字符串作为随机数生成器的种子?
【发布时间】:2014-06-09 06:29:40
【问题描述】:

在 64 位 Python 2.7.6 中这是 True,但在 32 位 Python 2.7.3 中是 False:

random.Random(hash("a")).random() == random.Random("a").random()

那么 Python 2.7.3 如何使用散列字符串作为随机数生成器的种子?

【问题讨论】:

  • Python 开源的 - 你可以阅读代码。
  • 另外,也可以在 32 位 Python 2.7.6 和 64 位 Python 2.7.3 中尝试以缩小 2.7.3 和 2.7.6 或 32 之间的差异位和 64 位。这是什么操作系统?
  • 我怀疑它在平台和构建架构之间以及特定字符串之间都有所不同。假设 Python 的 hash 分布良好,它应该适用于您尝试使用的大约一半的对象,并且有一半会失败。

标签: python python-2.7 random


【解决方案1】:

这是因为在 32 位上 hash("a") 是一个负数(因为平台长类型大小)并且随机模块的行为不同。

随机模块seed()函数:

  • 传递 int 或 long 将使用 PyNumber_Absolute()abs()
  • 传递一个对象(一个字符串)它将使用PyLong_FromUnsignedLong((unsigned long)hash)

符号位截断和abs给出不同的结果

例如:

  • abs(-10) = 10
  • ((unsigned long) -10) = 4294967286

【讨论】:

  • 这是正确的答案。值得注意的是,Python 2 中的a comment above the code that does this 错误地表示它在两种情况下都取绝对值。在 Python 3 中,the comment has been fixed 正确描述了它对非整数的作用(将带符号的哈希值转换为无符号的哈希值,相当于将 sys.maxsize 添加到任何负值)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多