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

Эффективно генерировать 16-значную буквенно-цифровую строку

Я ищу очень быстрый способ создания буквенно-цифрового уникального идентификатора для первичного ключа в таблице.

Будет ли что-то вроде этой работы?

def genKey():
    hash = hashlib.md5(RANDOM_NUMBER).digest().encode("base64")
    alnum_hash = re.sub(r'[^a-zA-Z0-9]', "", hash)
    return alnum_hash[:16]

Как бы вы могли генерировать случайные числа? Если я основываю его на микротайме, я должен учитывать возможность нескольких вызовов genKey() одновременно из разных экземпляров.

Или есть лучший способ сделать все это?

4b9b3361

Ответ 1

Поскольку ни один из ответов не дает вам случайную строку, состоящую из символов 0-9, a-z, A-Z: Вот рабочее решение, которое даст вам один из ок. 62 ^ 16 = 4,76724 e + 28 клавиш:

import random, string
x = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(16))
print(x)

Он также очень удобочитаем, не зная наизусть коды ASCII.

Еще более короткая версия, начиная с python 3.6.2:

import random, string
x = ''.join(random.choices(string.ascii_letters + string.digits, k=16))
print(x)

Ответ 2

Вы можете использовать это:

>>> import random
>>> ''.join(random.choice('0123456789ABCDEF') for i in range(16))
'E2C6B2E19E4A7777'

Нет гарантии, что сгенерированные ключи будут уникальными, поэтому вы должны быть готовы повторить попытку с новым ключом в случае сбоя исходной вставки. Кроме того, вы можете захотеть использовать детерминированный алгоритм для генерации строки из идентификатора с автоматическим добавлением вместо использования случайных значений, поскольку это гарантирует уникальность (но это также даст предсказуемые ключи).

Ответ 3

Посмотрите на модуль uuid (Python 2. 5+).

Быстрый пример:

>>> import uuid
>>> uid = uuid.uuid4()
>>> uid.hex
'df008b2e24f947b1b873c94d8a3f2201'

Обратите внимание, что OP запрашивает 16-символьную буквенно-цифровую строку, но строки UUID4 имеют длину 32 символа. Вы не должны усекать эту строку, вместо этого используйте полные 32 символа.

Ответ 4

В Python 3.6, выпущенном в декабре 2016 года, был представлен модуль secrets.

Теперь вы можете сгенерировать случайный токен следующим образом:

import secrets

secrets.token_hex(16)

Из документов Python:

Модуль secrets используется для генерации криптографически стойких случайные числа, подходящие для управления данными, такими как пароли, учетная запись аутентификация, токены безопасности и связанные секреты.

В частности, secrets следует использовать вместо предпочтения по умолчанию генератор псевдослучайных чисел в модуле random, который предназначен для моделирования и симуляции, а не безопасности или криптографии.

https://docs.python.org/3/library/secrets.html

Ответ 5

Для случайных чисел хороший источник os.urandom:

 >> import os
 >> import hashlib
 >> random_data = os.urandom(128)
 >> hashlib.md5(random_data).hexdigest()[:16]

Ответ 6

>>> import random
>>> ''.join(random.sample(map(chr, range(48, 57) + range(65, 90) + range(97, 122)), 16))
'CDh0geq3NpKtcXfP'

Ответ 7

Это значение увеличивается на 1 на каждый вызов (он обертывается). Решая, где лучшее место для хранения значения будет зависеть от того, как вы его используете. Вы можете найти это объяснение интереса, поскольку в нем обсуждается не только то, как Гиды работают, но и как сделать меньший.

Короткий ответ таков: Используйте некоторые из этих символов как временную метку, а другие символы - как "uniquifier", значение увеличивается на 1 при каждом вызове вашего генератора uid.

Ответ 8

import uuid    
print str(uuid.uuid1()).replace('-','')

Ответ 9

Вы также можете попробовать:

 ''.join([ chr(ord('a')+np.random.randint(24)) for i in range(0,16)])

Ответ 10

Просто используйте python builtin uuid:

Если UUIDs подходят для ваших целей, используйте встроенный uuid пакет.

Однолинейное решение:

>>> import uuid
>>> str(uuid.uuid4().get_hex().upper()[0:16])
'40003A9B8C3045CA'

Ответ 11

просто используйте встроенный python uuid:

import uuid
print uuid.uuid4().hex[:16].upper()