Además de la respuesta aceptada, hay una tercera opción que puede ser útil en algunos casos:
v1 con MAC aleatorio ("v1mc")
Puede hacer un híbrido entre v1 y v4 generando deliberadamente UUID v1 con una dirección MAC de transmisión aleatoria (esto está permitido por la especificación v1). El UUID v1 resultante depende del tiempo (como v1 normal), pero carece de toda la información específica del host (como v4). También está mucho más cerca de v4 en su resistencia a la colisión: v1mc = 60 bits de tiempo + 61 bits aleatorios = 121 bits únicos; v4 = 122 bits aleatorios.
El primer lugar donde encontré esto fue la función uuid_generate_v1mc () de Postgres . Desde entonces he usado el siguiente equivalente de Python:
from os import urandom
from uuid import uuid1
_int_from_bytes = int.from_bytes # py3 only
def uuid1mc():
# NOTE: The constant here is required by the UUIDv1 spec...
return uuid1(_int_from_bytes(urandom(6), "big") | 0x010000000000)
(nota: tengo una versión más larga + más rápida que crea el objeto UUID directamente; puede publicar si alguien lo desea)
En el caso de GRANDES volúmenes de llamadas / segundo, esto tiene el potencial de agotar la aleatoriedad del sistema. En su lugar, podría usar el random
módulo stdlib (probablemente también será más rápido). Pero tenga cuidado: solo se necesitan unos pocos cientos de UUID antes de que un atacante pueda determinar el estado de RNG y, por lo tanto, predecir parcialmente futuros UUID.
import random
from uuid import uuid1
def uuid1mc_insecure():
return uuid1(random.getrandbits(48) | 0x010000000000)