Эффективно генерировать 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() одновременно из разных экземпляров.
Или есть лучший способ сделать все это?
Ответы
Ответ 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()