Що таке 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 (випадкова)
- Версія — перша цифра третьої групи (13-та шістнадцяткова цифра). Вона показує, як створено UUID.
- Варіант — перша цифра четвертої групи (17-та шістнадцяткова цифра). У стандартних UUID два її старші біти дорівнюють
10, тож ця цифра завжди8,9,aабоb. Значення0–7належать старим ідентифікаторам NCS,cіdзарезервовано для зворотної сумісності з Microsoft, аeіf— для майбутнього використання.
Оскільки ці 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. Відмінності стосуються подання та зберігання:
- Запис. Інструменти Microsoft часто показують GUID великими літерами у фігурних дужках, наприклад
{F47AC10B-58CC-4372-A567-0E02B2C3D479}. Це те саме значення, що й запис малими літерами. - Порядок байтів у двійковому вигляді. Структура GUID від Microsoft ділить значення на 32-бітне поле, два 16-бітні поля та 8 окремих байтів. У little-endian-системах і в
Guid.ToByteArray()у .NET перші три поля зберігаються з байтами у зворотному порядку, а останні 8 байтів зберігають свій порядок. Це часто називають mixed-endian:
Текст: 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, але в індексі вони поводяться дуже по-різному.
- v4 випадковий, тому кожен новий рядок потрапляє у випадкове місце B-дерева індексу. Вставки зачіпають сторінки по всьому індексу, що спричиняє розщеплення сторінок, більше записів і більший робочий набір, який має залишатися в пам'яті.
- v7 починається з мітки часу, тому нові ID більші за старіші. Вставки йдуть у кінець індексу, як з автоінкрементним цілим числом, а рядки, створені разом, лежать поруч.
З v7 також можна сортувати за ID, щоб отримати порядок створення, і читати час створення прямо з ID. У цьому ж і недолік: будь-хто, хто бачить ID v7, знає, коли створено запис, з точністю до мілісекунди. Використовуйте v4 для публічних ідентифікаторів, час яких має залишатися приватним, а v7 — для внутрішніх ключів у великих таблицях з інтенсивним записом.
Як ефективно зберігати UUID
Зберігайте 16 байтів, а не 36-символьний текст. Текстовий стовпець займає щонайменше 36 байтів на значення, тобто більш ніж удвічі більше, і кожен індекс, що містить ключ, зростає разом із ним.
- PostgreSQL: використовуйте вбудований тип
uuid(16 байтів). - SQL Server: використовуйте
uniqueidentifier(16 байтів). - MySQL: використовуйте
BINARY(16)зUUID_TO_BIN()іBIN_TO_UUID()для перетворення.
Перетворюйте на текст лише на межах системи, наприклад в 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 Безкоштовно, без реєстрації.