gpt4 book ai didi

python - random.choice 不是随机的

转载 作者:太空狗 更新时间:2023-10-29 17:31:46 31 4
gpt4 key购买 nike

我在 Linux 上的多个并行 FCGI 进程中使用 Python 2.5。我用

    chars = string.ascii_letters + string.digits
cookie = ''.join([random.choice(chars) for x in range(32)])

生成不同的 cookie。假设 RNG 是从/dev/urandom 播种的,并且随机数序列来自 Mersenne twister,我预计碰撞的可能性几乎为零。

但是,我确实经常看到冲突,即使任何时候只有少数 (<100) 用户登录。

为什么随机数不是更随机?

最佳答案

它不应该生成重复项。

import random
chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
def gen():
return ''.join([random.choice(chars) for x in range(32)])

test = [gen() for i in range(100000)]
print len(test), len(set(test)) # 100000 100000

chars = "ab"; 出现重复的可能性很大; 1000000 次迭代中有 126 个重复项。 62 是不存在的。

也就是说,这不是生成 cookie 的好方法,因为 session cookie 需要不可预测,以避免涉及窃取他人 session cookie 的攻击。 Mersenne Twister 不是为生成安全随机数而设计的。这就是我所做的:

import os, hashlib
def gen():
return hashlib.sha1(os.urandom(512)).hexdigest()

test = [gen() for i in range(100000)]
print len(test), len(set(test))

...这应该是非常安全的(也就是说,很难获取一串 session cookie 并从中猜测其他现有的 session cookie)。

关于python - random.choice 不是随机的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1366047/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com