如何生成一个大小为 N 的字符串,由数字和大写英文字母组成,例如:
- 6U1S75
- 4Z4UKK
- U911K4
原文由 Hellnar 发布,翻译遵循 CC BY-SA 4.0 许可协议
这个 Stack Overflow 问题是当前谷歌搜索“随机字符串 Python”的最高结果。当前的最佳答案是:
''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(N))
这是一种很好的方法,但随机 PRNG 在密码学上并不安全。我假设很多研究这个问题的人都想生成随机字符串来加密或密码。您可以通过对上述代码进行少量更改来安全地执行此操作:
''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(N))
使用 random.SystemRandom()
而不是在 *nix 机器上随机使用 /dev/urandom 和 CryptGenRandom()
在 Windows 中。这些是加密安全的 PRNG。在需要安全 PRNG 的应用程序中使用 random.choice
而不是 random.SystemRandom().choice
可能具有潜在的破坏性,考虑到这个问题的普遍性,我敢打赌这个错误已经犯了很多次。
如果您使用的是 python3.6 或更高版本,则可以使用 MSeifert 的回答 中提到的新 secrets 模块:
''.join(secrets.choice(string.ascii_uppercase + string.digits) for _ in range(N))
原文由 Randy Marsh 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答5.2k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
4 回答3k 阅读
3 回答1.3k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
一行回答:
甚至更短的从 Python 3.6 开始使用
random.choices()
:加密更安全的版本: 请参阅这篇文章
详细来说,有一个干净的功能可以进一步重用:
它是如何工作的 ?
我们导入
string
一个包含常见 ASCII 字符序列的模块,以及random
一个处理随机生成的模块。string.ascii_uppercase + string.digits
只是连接表示大写 ASCII 字符和数字的字符列表:然后我们使用列表理解来创建一个包含“n”个元素的列表:
在上面的示例中,我们使用
[
创建列表,但我们不在id_generator
函数中,因此 Python 不会在内存中创建列表,而是在苍蝇,一只一只(更多关于 这里)。不是要求创建 ‘n’ 次字符串
elem
,我们将要求 Python 创建 ‘n’ 次随机字符,从字符序列中挑选:因此
random.choice(chars) for _ in range(size)
实际上是在创建一系列size
字符。从chars
中随机选取的字符:然后我们用一个空字符串连接它们,这样序列就变成了一个字符串: