Що таке UUID? Формат, версії та різниця з GUID

UUID (universally unique identifier, універсальний унікальний ідентифікатор) — це 128-бітне число, яким позначають дані без звернення до центрального сервера по наступний вільний ID. Зазвичай його записують 36 символами: 32 шістнадцяткові цифри у п'яти групах за схемою 8-4-4-4-12, наприклад f47ac10b-58cc-4372-a567-0e02b2c3d479. Формат визначено в RFC 9562 (травень 2024 року), який замінив RFC 4122.

Спробуйте безкоштовно: Генератор UUID Безкоштовно, без реєстрації.

Що таке UUID на практиці і навіщо він потрібен? Будь-яка система може створити його сама, навіть офлайн, і бути практично впевненою, що ніхто інший ніколи не створить таке саме значення. Тому UUID популярні як ключі баз даних, імена файлів, ідентифікатори запитів і повідомлень. У цьому посібнику пояснено формат, версії, реальну ймовірність колізії, різницю між UUID і GUID та вибір між v4 і v7. Щоб перевірити приклади, відкрийте безкоштовний генератор UUID в іншій вкладці.

Що таке UUID зсередини? Формат 8-4-4-4-12

128 біт — це 16 байтів. Кожен байт записується двома шістнадцятковими цифрами, що дає 32 цифри, а чотири дефіси доводять текстову форму до 36 символів. Дві позиції мають фіксоване значення:

f47ac10b-58cc-4372-a567-0e02b2c3d479
              ^    ^
              |    +-- 17-та цифра "a": варіант (8, 9, a або b = RFC 9562)
              +------- 13-та цифра "4": версія 4 (випадкова)

Оскільки ці 6 бітів фіксовані, випадковий UUID версії 4 містить 128 − 6 = 122 випадкові біти. Шістнадцяткові літери можуть бути великими, малими або змішаними, тож F47AC10B-… і f47ac10b-… — це той самий UUID; найпоширеніша домовленість — малі літери.

Версії UUID: від v1 до v8, nil і max

RFC 9562 визначає вісім версій і два спеціальні значення:

Версія Як будується Типове застосування
v1 60-бітна мітка часу (кроки по 100 нс від 1582 року) + послідовність годинника + ID вузла, традиційно MAC-адреса Застарілі системи
v2 DCE Security, у RFC детально не описана Майже не використовується
v3 MD5-хеш UUID простору імен та імені Відтворювані ID (краще v5)
v4 122 випадкові біти Типовий вибір
v5 SHA-1-хеш UUID простору імен та імені Відтворювані ID з імен
v6 Поля v1, переставлені так, щоб мітка часу сортувалася Перехід із v1
v7 48-бітна Unix-мітка часу в мілісекундах + випадкові біти Ключі баз даних, сортовані ID
v8 Власна структура; фіксовані лише версія та варіант Формати окремих постачальників
Nil 00000000-0000-0000-0000-000000000000 Заповнювач «немає значення»
Max ffffffff-ffff-ffff-ffff-ffffffffffff Сторожове значення або верхня межа

Версії на основі імені детерміновані. Простір імен DNS з ім'ям example.com завжди дає UUID v5 cfbff0d1-9375-5685-968c-48ce8b15ae17 на будь-якому комп'ютері й у будь-якій мові програмування. Використовуйте їх, коли однакові вхідні дані мають завжди давати однаковий ID.

UUID версії 7 ставить час на початок. Цей приклад створено 24.09.2026 о 12:00:00 UTC, тобто через 1 790 251 200 000 мілісекунд після епохи Unix, або 0x01a0d3496e00 у шістнадцятковому вигляді:

01a0d349-6e00-7c3f-9d21-4b6e8a1f0c57
^^^^^^^^^^^^^ ^    ^
|             |    +-- цифра варіанта "9"
|             +------- версія 7
+--------------------- 48-бітна мітка часу в мс

Решта 74 біти випадкові (або частково лічильник, залежно від бібліотеки).

Чи унікальні UUID? Імовірність колізії для v4

Унікальність UUID не гарантована: вона лише надзвичайно ймовірна. Зі 122 випадковими бітами існує 2^122 ≈ 5,3 × 10^36 можливих значень v4. Наближення парадоксу днів народження дає кількість n UUID, за якої ймовірність збігу хоча б двох становить 50 %:

n ≈ √(2 · ln 2 · 2^122) ≈ 2,71 × 10^18

Це 2,71 квінтильйона UUID. Генеруючи мільярд за секунду, ви досягли б цієї кількості приблизно за 86 років. За реалістичних обсягів ризик нехтовно малий:

Згенеровано UUID v4 Імовірність хоча б однієї колізії
1 мільярд (10^9) близько 9,4 × 10^-20
1 трильйон (10^12) близько 9,4 × 10^-14
103 трильйони (1,03 × 10^14) близько 1 до мільярда
2,71 × 10^18 близько 50 %

Ці цифри передбачають якісний генератор випадкових чисел. На практиці колізії виникають через помилки: погано ініціалізований генератор, клоновані віртуальні машини з однаковим станом або код, що копіює ID замість створення нового. Тому обмеження унікальності в базі даних усе одно варто мати.

UUID і GUID: у чому різниця?

На практиці ні в чому. GUID (globally unique identifier) — це назва, яку Microsoft дає тому самому 128-бітному значенню; вона використовується у Windows, COM, .NET і SQL Server. Наприклад, Guid.NewGuid() у .NET створює звичайний UUID версії 4. Відмінності стосуються подання та зберігання:

Текст:           f47ac10b-58cc-4372-a567-0e02b2c3d479
Порядок RFC:     f4 7a c1 0b | 58 cc | 43 72 | a5 67 0e 02 b2 c3 d4 79
Microsoft:       0b c1 7a f4 | cc 58 | 72 43 | a5 67 0e 02 b2 c3 d4 79

Текст однаковий, різняться лише 16 «сирих» байтів. Якщо копіювати двійкові GUID між системою Microsoft і системою, що очікує порядок RFC, значення перемішається. Конвертуйте через текстову форму або, починаючи з .NET 8, використовуйте ToByteArray(bigEndian: true). Microsoft описує переставлені групи в довідці Guid.ToByteArray.

Отже, «UUID чи GUID» — це питання назви, а не вибір, який треба робити.

UUID v4 чи v7 як первинний ключ

Обидва — 128-бітні UUID, але в індексі вони поводяться дуже по-різному.

З v7 також можна сортувати за ID, щоб отримати порядок створення, і читати час створення прямо з ID. У цьому ж і недолік: будь-хто, хто бачить ID v7, знає, коли створено запис, з точністю до мілісекунди. Використовуйте v4 для публічних ідентифікаторів, час яких має залишатися приватним, а v7 — для внутрішніх ключів у великих таблицях з інтенсивним записом.

Як ефективно зберігати UUID

Зберігайте 16 байтів, а не 36-символьний текст. Текстовий стовпець займає щонайменше 36 байтів на значення, тобто більш ніж удвічі більше, і кожен індекс, що містить ключ, зростає разом із ним.

Перетворюйте на текст лише на межах системи, наприклад в API та журналах.

Як згенерувати UUID у коді

Більшість мов мають вбудований генератор:

import uuid
uuid.uuid4()                                   # random v4
uuid.uuid7()                                   # v7, Python 3.14+
uuid.uuid5(uuid.NAMESPACE_DNS, "example.com")  # cfbff0d1-9375-5685-968c-48ce8b15ae17
crypto.randomUUID(); // v4, in browsers (HTTPS pages) and Node.js
SELECT gen_random_uuid();  -- v4, built in since PostgreSQL 13
SELECT uuidv7();           -- v7, PostgreSQL 18+
Guid.NewGuid();         // v4
Guid.CreateVersion7();  // v7, .NET 9+

crypto.randomUUID() описано на MDN. У браузері він працює лише на захищених сторінках (HTTPS).

Як перевірити UUID регулярним виразом

Цей шаблон приймає канонічну форму версій 1–8 зі стандартним варіантом (використовуйте порівняння без урахування регістру):

^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$

[1-8] перевіряє цифру версії, а [89ab] — варіант. Додайте окремі перевірки, якщо хочете також приймати nil і max UUID, фігурні дужки чи префікс urn:uuid:.

UUID — не секрет

UUID ідентифікує щось, але не захищає. RFC 9562 зазначає, що реалізації не повинні вважати UUID важкими для вгадування і не мають використовувати їх як механізм безпеки. v1 розкриває час створення і, традиційно, MAC-адресу комп'ютера, що його створив; v7 розкриває час створення. Навіть v4 із надійного генератора не призначений бути токеном для скидання пароля чи ключем API. Для цього використовуйте окремий випадковий токен, наприклад з генератора токенів, і все одно перевіряйте права доступу під час кожного запиту.

Альтернативи UUID

ULID — популярна альтернатива зі схожими цілями: 128 біт, 48-бітна мітка часу в мілісекундах і 80 випадкових бітів, записані 26 символами Crockford Base32, щоб їх можна було сортувати як текст. Якщо вам потрібен цей формат, генератор ULID створює й декодує ULID та перетворює їх на UUID. Для нових проєктів UUID v7 дає те саме впорядкування за часом і зберігає стандартний формат UUID, який бази даних розуміють нативно.

Генерування та перевірка UUID онлайн

Безкоштовний генератор UUID працює повністю у вашому браузері. Він створює UUID версій v1, v3, v4, v5 і v7, а також значення nil і max, до 500 за раз. Можна вибрати малі літери, великі літери чи фігурні дужки, прибрати дефіси й розділити список новими рядками, комами, пробілами або вивести як масив JSON, а потім скопіювати його чи завантажити як .txt або .json. Для v3 і v5 виберіть простір імен DNS, URL, OID або X.500 чи вставте власний.

Вбудований валідатор приймає канонічну форму, запис у фігурних дужках, urn:uuid: і введення без дефісів та показує версію, варіант і канонічну форму. Він декодує мітку часу UUID v1 і v7, а також послідовність годинника й вузол для v1. Кілька обмежень: інструмент не генерує v6 і v8, для v1 він використовує випадковий вузол замість вашої MAC-адреси, а ID v7, створені в ту саму мілісекунду, не гарантовано відсортовані в порядку створення, бо біти після мітки часу випадкові, а не лічильник.

Часті запитання

UUID і GUID — це одне й те саме?

Так. GUID — це назва UUID у Microsoft. Значення і текстовий формат однакові; інструменти Microsoft часто показують GUID великими літерами у фігурних дужках, а деякі API Microsoft зберігають перші три поля у двійковому вигляді в порядку little-endian.

Чи можуть два UUID збігтися?

Теоретично так, практично майже ніколи. Для v4 знадобилося б близько 2,71 × 10^18 UUID, щоб імовірність одного дубліката досягла 50 %. Реальні дублікати зазвичай виникають через програмні помилки або несправний генератор випадкових чисел, тож тримайте обмеження унікальності на ключових стовпцях.

Що обрати: UUID v4 чи v7?

Обирайте v7 для первинних ключів у таблицях з великою кількістю вставок, бо впорядковані за часом ID зберігають індекси компактними й сортуються за часом створення. Обирайте v4, коли ID публічний і не повинен нічого розкривати про час створення запису.

Яка довжина UUID?

UUID має 128 біт, тобто 16 байтів. Стандартна текстова форма має 36 символів: 32 шістнадцяткові цифри і 4 дефіси. Без дефісів — 32 символи, у фігурних дужках — 38.

Чи безпечно використовувати UUID в URL?

Їх можна показувати, але вони не замінюють контроль доступу. Випадковий v4 важко вгадати, проте він може потрапити назовні через журнали, історію браузера чи заголовок Referer, а v1 і v7 розкривають час створення. Завжди перевіряйте, чи має користувач доступ до ресурсу.

Спробуйте безкоштовно: Генератор UUID Безкоштовно, без реєстрації.