Создание уникальной строки в Python/Django
Я хочу создать строку (ключ) размером 5 для моих пользователей на моем веб-сайте. Больше похоже на PIN-код BBM.
Ключ будет содержать цифры и буквы в верхнем регистре:
Как я могу быть в покое о уникальности строк, даже если я их генерирую в миллионах?
В самом питоническом способе, как я могу это сделать?
Ответы
Ответ 1
Мой любимый
import uuid
uuid.uuid4().hex[:6].upper()
Если вы используете django, вы можете установить уникальный ограничитель в этом поле, чтобы убедиться, что он уникален. https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.Field.unique
Ответ 2
Не уверен в каких-либо коротких загадочных способах, но он может быть реализован с помощью простой прямой функции, предполагающей сохранение всех сгенерированных строк в наборе:
import random
def generate(unique):
chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
while True:
value = "".join(random.choice(chars) for _ in range(5))
if value not in unique:
unique.add(value)
break
unique = set()
for _ in range(10):
generate(unique)
Ответ 3
size = 5
''.join(random.choice(string.letters[26:] + string.digits) for in range(size))
это приведет к генерации некоторого короткого кода, но они могут быть дублированы. поэтому перед сохранением убедитесь, что они уникальны в вашей базе.
def generate(size=5):
code = ''.join(random.choice(string.letters[26:] + string.digits) for in range(size))
if check_if_duplicate(code):
return generate(size=5)
return code
или с использованием уникального ограничения django и обработки исключений.
Ответ 4
Начиная с 3.6. Вы можете использовать модуль секретов для создания хороших случайных строк. https://docs.python.org/3/library/secrets.html#module-secrets
import secrets
print(secrets.token_hex(5))