Подтвердить что ты не робот

Каков наилучший способ генерации случайных строк определенной длины в Python?

Для проекта мне нужен метод создания тысяч случайных строк при низком столкновении. Я ищу, чтобы они были всего 12 символов и только в верхнем регистре. Любые предложения?

4b9b3361

Ответ 1

CODE:

from random import choice
from string import ascii_uppercase

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

ВЫВОД:

5 примеров:

QPUPZVVHUNSN
EFJACZEBYQEB
QBQJJEEOYTZY
EOJUSUEAJEEK
QWRWLIWDTDBD

EDIT:

Если вам нужны только цифры, используйте константу digits вместо ascii_uppercase из модуля string.

3 примера:

229945986931
867348810313
618228923380

Ответ 2

В Django вы можете использовать функцию get_random_string в модуле django.utils.crypto.

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, здесь является его независимым кодом:

код:

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))

Ответ 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_gen), когда они вам нужны, или используйте random_200 = list(islice(random_gen, 200)), например...

Ответ 4

Для криптографически сильных псевдослучайных байтов вы можете использовать обертку pyOpenSSL вокруг OpenSSL.

Он предоставляет функцию bytes для сбора псевдослучайных последовательностей байтов.

from OpenSSL import rand

b = rand.bytes(7)

BTW, 12 прописных букв - это немного больше, чем 56 бит энтропии. Вам нужно будет только прочитать 7 байтов.

Ответ 5

Эта функция генерирует случайную строку букв UPPERCASE указанной длины,

например: длина = 6, сгенерирует следующий шаблон случайной последовательности

YLNYVQ

    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

Ответ 6

#!/bin/python3
import random
import string
def f(n: int) -> str:
        bytes(random.choices(string.ascii_uppercase.encode('ascii'),k=n)).decode('ascii')

беги быстрее для очень больших п. избегать объединения улиц