我想用字符串初始化一个伪随机生成器。说,我希望我能写出类似random.seed('Lorem ipsum')
的内容。
我需要一个在整数中转换字符串(任何字母数字字符串)的函数。有标准的方法吗?
答案 0 :(得分:1)
除了Dmitry提供的建议,为什么不只是内置的hash
函数?
print(hash('lorem ipsum'))` # 1163776412
答案 1 :(得分:1)
来自python2 docs:
random.seed(a=None)
[...]如果a不是None或int或long,则使用hash(a)代替
因此可以使用与random.seed("Lorem ipsum")
random.seed(hash("Lorem ipsum"))
答案 2 :(得分:1)
如果需要字符串的安全散列,这是一个例子。 有关安全散列函数的更多信息here
import random
import hashlib
def md5hash(aString):
#hash string using FIPS secure hash algorithm (sha256)
h = hashlib.sha256(aString)
#Convert to numeric
n = int(h.hexdigest(),base=16)
return n
s = 'Lorem ipsum'
h = md5hash(s)
random.seed(h)
print random.randint(1,h)
win32上的Python 2.7.9(默认,2014年12月10日,12:24:55)[MSC v.1500 32位(英特尔)] 输入“copyright”,“credits”或“license()”以获取更多信息。
================================ RESTART ============== ==================
55515536588238178253973576746556262163439168431854287257541058247489753668463
答案 3 :(得分:0)
传递给random.seed()
的字符串被散列为64位数字。两个不同的字符串可能会哈希到相同的64位数字,因此会以相同的方式初始化随机数生成器。我们尝试的字符串种子越多,观察到这种哈希冲突的可能性就越高。选中https://en.wikipedia.org/wiki/Birthday_problem,如果种子数量很少,则概率仍然非常低,因此我们通常可以忍受。为了安全起见,以下初始化代码将冲突概率降低了10 ^ 60以上:random.seed(int(hashlib.sha512(mystringseed).hexdigest(), 16))
Python 3.2将初始化从字符串种子更改为不使用Python内置的hash()
函数。该文档说使用了种子字符串的所有位。如果字符串比随机数生成器的内部状态的长度长,例如仅使用前几百个字符,则不清楚会发生什么。 (散列使用所有字符。)由于不再使用hash()
,因此Python 3.3引入的hash()
的随机化不会影响random.seed()
。尽管如此,Python 3.2的变化意味着在Python 2和具有相同字符串种子的Python> = 3.2中会生成不同的随机数序列。但是,当种子为整数时,初始化总是相同的。
由于在当前的Python 2和Python 3中以相同的方式使用整数种子,因此random.seed(int(hashlib.sha512(mystringseed).hexdigest(), 16))
将允许使用Python 2和Python> = 3.2再现结果。