如何生成大小为N的字符串,由数字和大写英文字母组成,例如:
6个754z4英国U911K4型
如何生成大小为N的字符串,由数字和大写英文字母组成,例如:
6个754z4英国U911K4型
当前回答
面向安全的方法
我们对任何安全相关的建议都是避免“自己动手”,并使用经过专门安全审查的机密模块。
这来自文档的最佳实践部分:
import string
import secrets
alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for i in range(8))
由于您特别要求使用大写字母,因此您可以用ascii_capsaper替换ascii_cletters,或者只使用以下内容将密码大写:
password = password.upper()
不以安全为目的的标准方法
这个问题的规范方法(如指定)使用随机模块中的choices()函数:
>>> from random import choices
>>> from string import ascii_uppercase, digits
>>> population = ascii_uppercase + digits
>>> str.join('', choices(population, k=6))
'6JWF1H'
其他回答
从Python 3.6开始,如果你需要密码安全,你应该使用secrets模块,而不是随机模块(否则这个答案与@Ignacio Vazquez Abrams的答案相同):
from secrets import choice
import string
''.join([choice(string.ascii_uppercase + string.digits) for _ in range(N)])
还有一点需要注意:在str.join的情况下,列表理解比使用生成器表达式更快!
生成包含字母、数字、“_”和“-”的随机16字节ID
os.urantom(16).translate((f'{string.ascii_letters}{string.digitals}-'*4).encode('ascii'))
一个简单的例子:
import string
import random
character = string.lowercase + string.uppercase + string.digits + string.punctuation
char_len = len(character)
# you can specify your password length here
pass_len = random.randint(10,20)
password = ''
for x in range(pass_len):
password = password + character[random.randint(0,char_len-1)]
print password
这个堆栈溢出问题是当前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的内置uuid:
如果uuid适合您的用途,请使用内置的uuid包。
单线解决方案:
导入uuid;uuid.uuid4().hhex.upper()[0:6]
深度版本:
例子:
import uuid
uuid.uuid4() #uuid4 => full random uuid
# Outputs something like: UUID('0172fc9a-1dac-4414-b88d-6b9a6feb91ea')
如果您完全需要您的格式(例如,“6U1S75”),可以这样做:
import uuid
def my_random_string(string_length=10):
"""Returns a random string of length string_length."""
random = str(uuid.uuid4()) # Convert UUID format to a Python string.
random = random.upper() # Make all characters uppercase.
random = random.replace("-","") # Remove the UUID '-'.
return random[0:string_length] # Return the random string.
print(my_random_string(6)) # For example, D9E50C