Python 2.7.3如何哈希用于随机数生成器种子的字符串?

9 投票
1 回答
1397 浏览
提问于 2025-04-18 04:02

在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是怎么对用来生成随机数的字符串进行哈希处理的呢?

1 个回答

9

这是因为在32位系统中,hash("a")的结果是一个负数(这是因为平台的长整型大小),所以随机模块的表现会有所不同。

随机模块的seed()函数:

  • 如果传入的是整数或长整型,它会使用 PyNumber_Absolute(),也就是 abs() 函数。
  • 如果传入的是一个对象(比如字符串),它会使用 PyLong_FromUnsignedLong((unsigned long)hash)

符号位截断和绝对值计算会得到不同的结果。

举个例子:

  • abs(-10) = 10,也就是说负数的绝对值是正数。
  • ((unsigned long) -10) = 4294967286,这里把负数转换成无符号长整型后,结果变成了一个很大的正数。

撰写回答