Além da resposta aceita, há uma terceira opção que pode ser útil em alguns casos:
v1 com MAC aleatório ("v1mc")
Você pode fazer um híbrido entre v1 e v4 gerando deliberadamente UUIDs v1 com um endereço MAC de transmissão aleatória (isso é permitido pela especificação v1). O UUID da v1 resultante depende do tempo (como a v1 normal), mas não possui todas as informações específicas do host (como a v4). Também está muito mais próximo da v4 em sua resistência à colisão: v1mc = 60 bits de tempo + 61 bits aleatórios = 121 bits únicos; v4 = 122 bits aleatórios.
O primeiro lugar que encontrei foi a função uuid_generate_v1mc () do Postgres . Desde então, usei o seguinte equivalente em 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: eu tenho uma versão mais longa + rápida que cria o objeto UUID diretamente; pode postar se alguém quiser)
No caso de grandes volumes de chamadas / segundo, isso pode esgotar a aleatoriedade do sistema. Você pode usar o random
módulo stdlib (provavelmente também será mais rápido). Mas lembre-se: são necessárias apenas algumas centenas de UUIDs antes que um invasor possa determinar o estado do RNG e, portanto, prever parcialmente UUIDs futuros.
import random
from uuid import uuid1
def uuid1mc_insecure():
return uuid1(random.getrandbits(48) | 0x010000000000)