Окрім прийнятої відповіді, є ще третій варіант, який може бути корисним у деяких випадках:
v1 з випадковим MAC ("v1mc")
Ви можете зробити гібрид між v1 та v4, навмисно генеруючи v1 UUID з випадковою широкомовною MAC-адресою (це дозволено специфікацією v1). Отриманий v1 UUID залежить від часу (як звичайний v1), але йому не вистачає всієї інформації про хости (наприклад, v4). Це також набагато ближче до v4 за його стійкістю до зіткнення: v1mc = 60 біт часу + 61 випадковий біт = 121 унікальний біт; v4 = 122 випадкових біта.
Перше місце, з яким я стикався, була функція uuid_generate_v1mc () Postgres . З тих пір я використовував наступний еквівалент 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)
(зверніть увагу: у мене є довша + більш швидка версія, яка безпосередньо створює об'єкт UUID; може публікувати, якщо хто хоче)
У випадку великої кількості дзвінків в секунду, це може призвести до випадкових вичерпань системи. Ви можете використати random
натомість модуль stdlib (це, мабуть, також буде швидше). Але ЗАБЕЖАЙТЕ: потрібно лише кілька сотень UUID, перш ніж зловмисник зможе визначити стан RNG і тим самим частково передбачити майбутні UUID.
import random
from uuid import uuid1
def uuid1mc_insecure():
return uuid1(random.getrandbits(48) | 0x010000000000)