Как создаются UUID
UUID — это 128 бит, записанные как 32 шестнадцатеричные цифры в пяти группах. Четыре бита указывают версию, а два или три — вариант; остальное зависит от версии. RFC 9562, опубликованный в 2024 году, заменил старый RFC 4122 и добавил версии 6, 7 и 8.
v4 xxxxxxxx-xxxx-4xxx-Vxxx-xxxxxxxxxxxx v7 tttttttt-tttt-7ccc-Vxxx-xxxxxxxxxxxx t = Unix time in ms (48 bits) c = counter or random (12 bits) x = random, V = 8, 9, a or b
Версия 4 заполняет остальные 122 бита случайными данными; эта страница берёт их у криптографического генератора случайных чисел вашего браузера. Версия 7 начинается с времени Unix в миллисекундах (48 бит), поэтому UUID, созданные позже, сортируются после более ранних, а остальное заполняется случайными битами. Если в одну миллисекунду создаётся много UUID, 12 бит после версии работают как счётчик, как разрешает RFC 9562, поэтому даже список из 1 000 остаётся упорядоченным.
Проверка читает биты версии и варианта любого UUID, а для версий 1, 6 и 7 — ещё и время, которое в нём хранится. UUID v4 времени не содержит, поэтому из него можно прочитать только версию.
Пример
Пример из RFC 9562 — 017f22e2-79b0-7cc3-98c4-dc0c0c07398f. Первые 12 шестнадцатеричных цифр, 017f22e279b0, — это 1 645 557 742 000 миллисекунд с 1970 года: 22 февраля 2022 года, 19:22:22 UTC. Цифра 7 после второго дефиса — версия, а 9 после третьего обозначает стандартный вариант.
Вопросы
UUID v4 или v7: что выбрать?
Для первичных ключей баз данных берите v7: новые строки получают большие идентификаторы и попадают в конец индекса, а не в случайные места, поэтому вставки остаются быстрыми, а индексы компактными. Берите v4, когда идентификатор не должен выдавать время создания, например в публичной ссылке. Оба достаточно уникальны для любых практических целей.
Могут ли два UUID совпасть?
Теоретически да, на практике нет. У UUID v4 122 случайных бита: чтобы получить 50 % вероятности хотя бы одного повтора, нужно создать около 2,7 квинтиллиона (2,7 × 10^18) идентификаторов. У UUID v7 за меткой времени в миллисекундах стоят от 62 до 74 случайных бит, в зависимости от способа создания, поэтому для коллизии понадобилось бы огромное число идентификаторов в одну миллисекунду. Повторы вызывает плохой генератор случайных чисел, а не сам формат.
GUID — это то же самое, что UUID?
Да. GUID — название Microsoft для того же 128-битного идентификатора, а Guid.NewGuid() в .NET создаёт UUID версии 4. Инструменты Microsoft часто записывают GUID в верхнем регистре и в фигурных скобках: чтобы получить такой вид, используйте параметры выше.
Выдаёт ли UUID v7, когда он был создан?
Да, с точностью до миллисекунды: вставьте его в проверку выше, и она покажет время. Благодаря этому они хорошо сортируются, но любой, кто увидит идентификатор, узнает и время создания записи. Если это важно, для публичных идентификаторов используйте v4.
Как создать UUID в командной строке?
В Linux: cat /proc/sys/kernel/random/uuid или uuidgen. В macOS: uuidgen (в верхнем регистре). В PostgreSQL: gen_random_uuid() для v4 и uuidv7() начиная с версии 18. В Python: import uuid; uuid.uuid4() и uuid.uuid7() начиная с Python 3.14. В JavaScript: crypto.randomUUID().