首页 > Python > 如何使用大写字母和数字生成随机字符串?

如何使用大写字母和数字生成随机字符串?

上一篇 下一篇

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

  • 6U1S75
  • 4Z4UKK
  • U911K4

分割线

网友回答:

这个堆栈溢出问题是当前谷歌“随机字符串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))

在 *nix 机器和 Windows 中使用而不是随机使用 /dev/urandom。这些是加密安全的 PRNG。 在需要安全 PRNG 的应用程序中使用而不是使用可能是毁灭性的,鉴于这个问题的流行,我敢打赌这个错误已经犯了很多次了。random.SystemRandom()CryptGenRandom()random.choicerandom.SystemRandom().choice

如果你使用的是python3.6或更高版本,你可以使用MSeifert的答案中提到的新的secrets模块:

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

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

分割线

网友回答:

一行回答:

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

甚至更短,从 Python 3.6 开始使用:random.choices()

''.join(random.choices(string.ascii_uppercase + string.digits, k=N))

加密更安全的版本:见这篇文章

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

详细地说,带有一个干净的功能,以便进一步重用:

>>> import string
>>> import random
>>> def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
...    return ''.join(random.choice(chars) for _ in range(size))
...
>>> id_generator()
'G5G74W'
>>> id_generator(3, "6793YUIO")
'Y3U'

它是如何工作的?

我们导入 ,一个包含常见 ASCII 字符序列的模块,以及一个处理随机生成的模块。stringrandom

string.ascii_uppercase + string.digits仅连接表示大写 ASCII 字符和数字的字符列表:

>>> string.ascii_uppercase
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.digits
'0123456789'
>>> string.ascii_uppercase + string.digits
'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'

然后我们使用列表推导来创建“n”元素的列表:

>>> range(4) # range create a list of 'n' numbers
[0, 1, 2, 3]
>>> ['elem' for _ in range(4)] # we use range to create 4 times 'elem'
['elem', 'elem', 'elem', 'elem']

在上面的例子中,我们用来创建列表,但我们不在函数中,所以 Python 不会在内存中创建列表,而是动态生成元素,一个接一个(更多关于这里)。[id_generator

我们将要求 Python 创建 ‘n’ 次字符串,而不是要求创建 ‘n’ 次随机字符,从字符序列中挑选:elem

>>> random.choice("abcde")
'a'
>>> random.choice("abcde")
'd'
>>> random.choice("abcde")
'b'

因此,实际上是在创建一系列字符。随机选取的字符:random.choice(chars) for _ in range(size)sizechars

>>> [random.choice('abcde') for _ in range(3)]
['a', 'b', 'b']
>>> [random.choice('abcde') for _ in range(3)]
['e', 'b', 'e']
>>> [random.choice('abcde') for _ in range(3)]
['d', 'a', 'c']

然后我们只需用一个空字符串连接它们,这样序列就变成了一个字符串:

>>> ''.join(['a', 'b', 'b'])
'abb'
>>> [random.choice('abcde') for _ in range(3)]
['d', 'c', 'b']
>>> ''.join(random.choice('abcde') for _ in range(3))
'dac'

分割线

网友回答:

只需使用 Python 的内置 uuid:

如果 UUID 适合您的目的,请使用内置的 uuid 包。

单线解决方案:

import uuid; uuid.uuid4().hex.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

模板简介:该模板名称为【如何使用大写字母和数字生成随机字符串?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Python】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 523次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 02-24
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
html5 企业网站 自适应 微信素材 响应式 微信模板 单页式简历模板 微信图片 微信公众平台 微信文章
您可能会喜欢的其他模板