Python 2.7.3如何哈希用于随机数生成器种子的字符串?
在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
,这里把负数转换成无符号长整型后,结果变成了一个很大的正数。