Generar una cadena única en Python / Django

Lo que quiero es generar una cadena (clave) de tamaño 5 para mis usuarios en mi sitio web. Más como un PIN de BBM.

La clave contendrá números y letras mayúsculas en inglés:

  • AU1B7
  • Y56AX
  • M0K7A

¿Cómo puedo estar tranquilo acerca de la singularidad de las cadenas incluso si las genero en millones?

De la manera más python posible, ¿cómo puedo hacer esto?

Mi favorito es

 import uuid uuid.uuid4().hex[:6].upper() 

Si usas django, puedes establecer la restricción única en este campo para asegurarte de que sea único. https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.Field.unique

No estoy seguro de ninguna forma críptica corta, pero puede implementarse utilizando una función simple y directa suponiendo que guarde todas las cadenas generadas en un conjunto:

 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) 
 size = 5 ''.join(random.choice(string.letters[26:] + string.digits) for in range(size)) 

Esto generará algún código corto, pero se pueden duplicar. así que compruebe si son únicos en su base de datos antes de guardar.

 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 

o usando la restricción única de django, y manejar las excepciones.

Desde 3.6 Puedes usar el módulo de secretos para generar cadenas aleatorias agradables. https://docs.python.org/3/library/secrets.html#module-secrets

 import secrets print(secrets.token_hex(5))