使用字符串初始化伪随机生成器

时间:2017-01-17 14:36:13

标签: python random

我想用字符串初始化一个伪随机生成器。说,我希望我能写出类似random.seed('Lorem ipsum')的内容。

我需要一个在整数中转换字符串(任何字母数字字符串)的函数。有标准的方法吗?

4 个答案:

答案 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 ============== ==================

             

55515536​​588238178253973576746556262163439168431854287257541058247489753668463

    
  

答案 3 :(得分:0)

Python 2

传递给random.seed()的字符串被散列为64位数字。两个不同的字符串可能会哈希到相同的64位数字,因此会以相同的方式初始化随机数生成器。我们尝试的字符串种子越多,观察到这种哈希冲突的可能性就越高。选中https://en.wikipedia.org/wiki/Birthday_problem,如果种子数量很少,则概率仍然非常低,因此我们通常可以忍受。为了安全起见,以下初始化代码将冲突概率降低了10 ^ 60以上:random.seed(int(hashlib.sha512(mystringseed).hexdigest(), 16))

Python 3

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再现结果。