如何生成大小为N的字符串,由数字和大写英文字母组成,例如:

6个754z4英国U911K4型


当前回答

这个堆栈溢出问题是当前Google搜索“随机字符串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()而不仅仅是random在*nix机器上使用/dev/urandom,在Windows中使用CryptGenRandom(。这些是加密安全的PRNG。在需要安全PRNG的应用程序中使用random.choice而不是random.SystemRandom().choice可能会带来潜在的破坏性,鉴于这个问题的流行性,我敢打赌这个错误已经犯过很多次了。

如果您使用的是python3.6或更高版本,您可以使用MSeiffet回答中提到的新秘密模块:

''.join(secrets.choice(string.ascii_uppercase + string.digits) for _ in range(N))

模块文档还讨论了生成安全令牌的便捷方法和最佳实践。

其他回答

现在可以在这里使用一个新的库(python>=3.6)

from chancepy import Chance

random_string = Chance.string(length=10, pool="someLettersAndNumbers123")
>>> import string 
>>> import random

以下逻辑仍然生成6个字符的随机样本

>>> print ''.join(random.sample((string.ascii_uppercase+string.digits),6))
JT7K3Q

无需乘以6

>>> print ''.join(random.sample((string.ascii_uppercase+string.digits)*6,6))

TK82HK

这是对Anurak Uniyal的回应的一种理解,也是我自己在研究的东西。

import random
import string

oneFile = open('‪Numbers.txt', 'w')
userInput = 0
key_count = 0
value_count = 0
chars = string.ascii_uppercase + string.digits + string.punctuation

for userInput in range(int(input('How many 12 digit keys do you want?'))):
    while key_count <= userInput:
        key_count += 1
        number = random.randint(1, 999)
        key = number

        text = str(key) + ": " + str(''.join(random.sample(chars*6, 12)))
        oneFile.write(text + "\n")
oneFile.close()

我发现这更简单、更干净。

str_Key           = ""
str_FullKey       = "" 
str_CharacterPool = "01234ABCDEFfghij~>()"
for int_I in range(64): 
    str_Key = random.choice(str_CharacterPool) 
    str_FullKey = str_FullKey + str_Key 

只需更改64以更改长度,更改CharacterPool以仅使用字母数字、仅使用数字或奇怪的字符或任何您想要的字符。

生成包含字母、数字、“_”和“-”的随机16字节ID

os.urantom(16).translate((f'{string.ascii_letters}{string.digitals}-'*4).encode('ascii'))