什么';在Python中,生成特定长度的随机字符串的最佳方法是什么?

什么';在Python中,生成特定长度的随机字符串的最佳方法是什么?,python,random,Python,Random,对于一个项目,我需要一种在保持低冲突的同时创建数千个随机字符串的方法。我正在寻找它们只有12个字符长和大写。有什么建议吗?代码: from random import choice from string import ascii_uppercase print(''.join(choice(ascii_uppercase) for i in range(12))) 输出: from random import choice from string import ascii_uppercas

对于一个项目,我需要一种在保持低冲突的同时创建数千个随机字符串的方法。我正在寻找它们只有12个字符长和大写。有什么建议吗?

代码:

from random import choice
from string import ascii_uppercase

print(''.join(choice(ascii_uppercase) for i in range(12)))
输出:

from random import choice
from string import ascii_uppercase

print(''.join(choice(ascii_uppercase) for i in range(12)))
5个例子:


编辑:

from random import choice
from string import ascii_uppercase

print(''.join(choice(ascii_uppercase) for i in range(12)))
如果您只需要数字,请使用常量而不是模块中的常量

3个例子:


可以制作发电机:

from string import ascii_uppercase
import random
from itertools import islice

def random_chars(size, chars=ascii_uppercase):
    selection = iter(lambda: random.choice(chars), object())
    while True:
        yield ''.join(islice(selection, size))

random_gen = random_chars(12)
print next(random_gen)
# LEQIITOSJZOQ
print next(random_gen)
# PXUYJTOTHWPJ

然后在需要的时候从发电机上拔下。。。需要时可以使用
next(random\u gen)
,或者使用
random\u 200=list(islice(random\u gen,200))
例如…

对于加密性强的伪随机字节,可以使用OpenSSL的包装器

它提供了收集伪随机字节序列的功能


顺便说一句,12个大写字母比56位熵多一点。您只需读取7个字节。

通过
Django
,您可以在
Django.utils.crypto
模块中使用
get\u random\u string
函数

get_random_string(length=12,
    allowed_chars=u'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
    Returns a securely generated random string.

    The default length of 12 with the a-z, A-Z, 0-9 character set returns
    a 71-bit value. log_2((26+26+10)^12) =~ 71 bits
例如:

get_random_string()
u'ngccjtxvvmr9'

get_random_string(4, allowed_chars='bqDE56')
u'DDD6'
但是,如果您不想拥有Django,它的独立代码是:

代码:


此函数生成指定长度的随机大写字母字符串

例如:length=6,将生成以下随机序列模式

YLNYVQ


跑得更快,速度非常快。避免str串联。

是的,这是误读:“12位长且大写”-因为数字不能是大写的,如果您需要字母数字,即ASCII大写加数字,那么
导入数字
打印('''.join(范围(12)中的i的选择(ASCII_大写+数字))
每次都会给出唯一的Id吗?如果我从多个线程(例如其中两个线程)调用此函数10000次,会怎么样?在给定时间点发生碰撞或获得相同id的概率是多少?@AnilJ有关
random
模块如何工作的更多信息,请阅读该模块的官方文档:嗯,Python3上没有数字。您可以使用
string.hexdigits
混合使用'0123456789ABCDEFABCDDEF',也可以对所有字母使用
string.digits+string.ascii_字母
。您的意思是不需要任何小写数字吗?嗯,是的,应该澄清一下:)别忘了阅读这一页。碰撞的可能性似乎完全取决于“随机字符串”的大小,但这并不意味着攻击者无法重新创建随机数;生成的随机数不是加密安全的。哈,对。我指的是字母数字。使用生成器的好处是:@martineau可以一次取一个,用不同的变量设置一个,可以一次取n多个,等等。。。主要区别在于,它实际上是一个iterable本身,而不是反复调用函数……为什么不反复调用函数呢?
functools.partial
可以修复参数,
list(itertools.islice(gen,n))
并不比xrange(n)中的
[func()]
@user2357112通过构建生成器,与重复设置和调用函数相比,恢复其状态具有优势。。。另外,
list
islice
将在实现级别工作,而不是作为一个列表comp,它可能会泄漏其
(在Py 2.x中)变量,并且必须构建一个不必要的范围约束,否则将被处理。。。此外,在函数之上构建比在流之上构建更困难……12个随机选择的大写字母不是对应于约56.4位的熵吗?rand.bytes在OpenSSL的最新版本中不再受支持,上面的代码
random#str_seq=“ABC@$%^和+124;*()opqrstuvxyz”
可以给出更复杂的结果。
get_random_string()
u'ngccjtxvvmr9'

get_random_string(4, allowed_chars='bqDE56')
u'DDD6'
import random
import hashlib
import time

SECRET_KEY = 'PUT A RANDOM KEY WITH 50 CHARACTERS LENGTH HERE !!'

try:
    random = random.SystemRandom()
    using_sysrandom = True
except NotImplementedError:
    import warnings
    warnings.warn('A secure pseudo-random number generator is not available '
                  'on your system. Falling back to Mersenne Twister.')
    using_sysrandom = False


def get_random_string(length=12,
                      allowed_chars='abcdefghijklmnopqrstuvwxyz'
                                    'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'):
    """
    Returns a securely generated random string.

    The default length of 12 with the a-z, A-Z, 0-9 character set returns
    a 71-bit value. log_2((26+26+10)^12) =~ 71 bits
    """
    if not using_sysrandom:
        # This is ugly, and a hack, but it makes things better than
        # the alternative of predictability. This re-seeds the PRNG
        # using a value that is hard for an attacker to predict, every
        # time a random string is required. This may change the
        # properties of the chosen random sequence slightly, but this
        # is better than absolute predictability.
        random.seed(
            hashlib.sha256(
                ("%s%s%s" % (
                    random.getstate(),
                    time.time(),
                    SECRET_KEY)).encode('utf-8')
            ).digest())
    return ''.join(random.choice(allowed_chars) for i in range(length))
    import random as r

    def generate_random_string(length):
        random_string = ''
        random_str_seq = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        for i in range(0,length):
            if i % length == 0 and i != 0:
                random_string += '-'
            random_string += str(random_str_seq[r.randint(0, len(random_str_seq) - 1)])
        return random_string
#!/bin/python3
import random
import string
def f(n: int) -> str:
        bytes(random.choices(string.ascii_uppercase.encode('ascii'),k=n)).decode('ascii')