Генератор UUID
Що таке UUID?
UUID (Universally Unique Identifier) – це 128-бітний ідентифікатор, що використовується в комп’ютерних системах для унікальної ідентифікації інформації. UUID стандартизовано згідно з RFC 4122 і завдяки своїй величезній ентропії гарантує практично нульову ймовірність колізії – це означає, що два незалежно згенеровані UUID майже напевно будуть унікальними.
UUID має стандартний формат: xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx, де кожен x – це шістнадцяткова цифра (0-9, a-f), M позначає версію UUID, а N позначає варіант.
Версії UUID
UUID v1 (Мітка часу + MAC-адреса)
UUID v1 базується на поточній мітці часу (timestamp) та випадковому значенні (у браузері замість MAC-адреси). Використовує 100-наносекундні інтервали з 15 жовтня 1582 року (Григоріанський календар).
Використання:
- Ситуації, коли потрібне хронологічне сортування UUID
- Дебаггінг та логування (UUID містить інформацію про час створення)
- Розподілені системи з часовою синхронізацією
Приклад: 6ba7b810-9dad-11d1-80b4-00c04fd430c8
Переваги:
- UUID можна сортувати хронологічно за часом створення
- Корисно для аудиту та дебаггінгу
- Містить інформацію про мітку часу
Недоліки:
- Потенційний ризик безпеки – містить мітку часу
- У браузері не містить справжньої MAC-адреси (замінено випадковим значенням)
- Погана локація бази даних (мітка часу знаходиться в молодших бітах)
UUID v3 (MD5 хеш)
UUID v3 генерується за допомогою MD5 хешу простору імен UUID та імені. Детермінований – однаковий простір імен + ім’я завжди створюватимуть однаковий UUID.
Використання:
- Перетворення URL, імен DNS або інших ідентифікаторів на UUID
- Ситуації, коли потрібен відтворюваний UUID
- Відображення між різними системами ідентифікації
Приклад: a3bb189e-8bf9-3888-9912-ace4e6543002
Переваги:
- Детермінований (однаковий вхід = однаковий вихід)
- Ідеально підходить для перетворення відомих ідентифікаторів
- Відсутність колізій для різних входів
Недоліки:
- MD5 – застарілий алгоритм (віддавайте перевагу v5)
- Вимагає простору імен та імені
- Неможливо відновити початковий вхід
UUID v4 (Випадковий) - РЕКОМЕНДОВАНО
Найпоширеніша версія UUID. UUID v4 генерується чисто випадково за допомогою криптографічно безпечного генератора випадкових чисел (crypto.getRandomValues()).
Використання:
- Первинні ключі бази даних
- Ідентифікатори сесій (session IDs)
- Унікальні імена файлів
- Токени API
- Загальні цілі, де потрібен гарантовано унікальний ID
Приклад: f47ac10b-58cc-4372-a567-0e02b2c3d479
Переваги:
- Максимальна ентропія та безпека
- Відсутність залежності від часу або системних параметрів
- Найпростіша реалізація
Ймовірність колізії: При генерації 1 мільярда UUID за секунду протягом 100 років шанс колізії становить приблизно 0,00000006%.
UUID v5 (SHA-1 хеш)
UUID v5 ідентичний v3, але використовує SHA-1 замість MD5. Більш сучасна та безпечна альтернатива v3.
Використання:
- Те саме, що й v3, але з кращою безпекою
- Переважний над v3 для нових проєктів
- Генерація UUID з URL, імен DNS, OID, X.500 DN
Приклад: 886313e1-3b8a-5372-9b90-0c9aee199e5d
Переваги:
- Детермінований
- SHA-1 є більш надійним, ніж MD5
- Підходить для відображення між системами
Недоліки:
- SHA-1 також вважається застарілим (але все ще безпечніший, ніж MD5)
- Вимагає простору імен та імені
UUID v6 (Упорядкована мітка часу)
UUID v6 – це покращена версія v1 з переупорядкованими часовими бітами для кращого індексування бази даних. Розроблений для вирішення проблем з локальністю в базах даних.
Використання:
- Первинні ключі бази даних з часовим сортуванням
- Системи, що вимагають хронологічного сортування та продуктивності БД
- Сучасна альтернатива v1
Приклад: 1ec9414c-232a-6b00-b3c8-9e6bdeced846
Переваги:
- Краща локація бази даних, ніж у v1 (мітка часу у старших бітах)
- Хронологічне сортування
- Сумісний зі стандартом UUID
Недоліки:
- Менш поширений, ніж v1/v4
- Все ще містить інформацію про час (ризик безпеки)
UUID v7 (Unix мітка часу)
UUID v7 використовує Unix мітку часу (мілісекунди з 1970 року) + випадкові біти. Найновіша версія UUID з найкращою локацією бази даних.
Використання:
- Сучасні первинні ключі бази даних
- Системи, що вимагають продуктивності + часового сортування
- Заміна v1/v6 у нових проєктах
Приклад: 017f22e2-79b0-7cc3-98c4-dc0c0c07398f
Переваги:
- Найкраща локація бази даних серед усіх версій
- Unix мітка часу є стандартною
- Поєднує переваги випадковості та часового сортування
Недоліки:
- Відносно нова специфікація (RFC 4122bis)
- Менш підтримувана в застарілих системах
Яку версію UUID використовувати?
Посібник з вибору
Потрібна максимальна безпека та випадковість? → Використовуйте UUID v4 (найпоширеніший вибір)
Потрібне часове сортування та продуктивність БД? → Використовуйте UUID v7 (сучасний) або UUID v6 (стандарт)
Потрібні відтворювані UUID з існуючих ідентифікаторів? → Використовуйте UUID v5 (SHA-1) або UUID v3 (MD5, застарілий)
Потрібна мітка часу та аудиторський слід? → Використовуйте UUID v1 (застарілий, гірша продуктивність БД)
Бази даних
Для нових проєктів: UUID v7 або v4
- v7 ідеально підходить для часового сортування + продуктивності
- v4 для максимальної випадковості без інформації про час
Для застарілих систем: UUID v1 або v6
- v6 має кращу локацію БД, ніж v1
- v1 широко підтримується
Переваги UUID як первинного ключа:
- Глобальна унікальність – Можна поєднувати дані з різних баз даних без конфліктів
- Безпека – На відміну від послідовних ID (1, 2, 3…), неможливо вгадати наступні значення
- Розподілені системи – UUID можна генерувати незалежно на кількох серверах без координації
- Злиття баз даних – При злитті двох баз даних не виникає конфліктів
Недоліки:
- Більший розмір (16 байт проти 4-8 байт для цілого числа)
- Повільніше індексування в деяких базах даних (використовуйте v6/v7 для кращої продуктивності)
- Менш читабельний для людини
API та веб-сервіси
- REST API – Унікальні ідентифікатори для ресурсів
- GraphQL – Глобальні ідентифікатори для вузлів
- Webhook – Відстеження запитів та відповідей
- Токени – ID сесій, токени оновлення
Файли та сховища
- Імена файлів – Запобігання колізіям під час завантаження
- S3/Хмарне сховище – Унікальні шляхи до об’єктів
- Ключі кешу – Ідентифікатори в системах кешування
Фронтенд-додатки
- React/Vue компоненти – Унікальні ключі для списків
- Тимчасові ID – ID перед збереженням у базу даних
- Локальне сховище – Ключі для збережених даних
- Offline-first додатки – Генерація ID без підключення до сервера
Розширені функції генератора
Генерація UUID з власним часом
Для версій, що базуються на часі (v1, v6, v7), ви можете вибрати будь-яку мітку часу за допомогою вибору дати та часу. Це корисно для:
Тестування:
- Симуляція UUID, створених у минулому
- Тестування часового сортування в базах даних
- Відтворення UUID для дебаггінгу
Міграція даних:
- Генерація UUID з історичними мітками часу
- Заповнення даних з коректними значеннями міток часу
- Імпорт даних з різних часових періодів
Аудит та відповідність:
- Реконструкція UUID за часом створення запису
- Ретроактивна генерація ідентифікаторів
Приклад використання:
- Виберіть версію v1, v6 або v7
- Встановіть дату та час за допомогою вибору дати та часу
- Згенеруйте UUID з вашою власною міткою часу
UUID на основі хешу (v3, v5)
Для детермінованих UUID ви можете використовувати версії v3 (MD5) або v5 (SHA-1):
Як використовувати:
- Виберіть простір імен відповідно до типу вашого ідентифікатора
- Введіть назву/значення
- Згенеруйте UUID
Приклади:
| Простір імен | Назва (ввід) | Використання |
|---|---|---|
| DNS | example.com | Перетворення доменного імені на UUID |
| DNS | google.com | Кожен вебсайт має унікальний UUID |
| URL | https://example.com/page | Перетворення URL на UUID |
| URL | https://api.example.com/users/123 | Кінцева точка API як UUID |
| OID | 1.3.6.1.4.1.343 | Ідентифікатор об’єкта на UUID |
| X.500 | CN=John Doe,O=Company | Розрізнене ім’я на UUID |
Важливі властивості:
- ✅ Детермінований: однаковий вхід = завжди однаковий UUID
- ✅ Відтворюваний: ви можете відтворити UUID будь-коли
- ✅ Послідовний: однаковий UUID у різних системах
- ❌ Неможливо декодувати: з UUID неможливо отримати початкову назву
- ℹ️ Один UUID: для v3/v5 завжди генерується лише один UUID (однаковий вхід = однаковий вихід)
Практичне використання:
// Приклад: Перетворення URL на UUID v5
Namespace: URL
Name: https://example.com/api/users/123
Result: 886313e1-3b8a-5372-9b90-0c9aee199e5d
// Однаковий вхід = завжди однаковий UUID
Namespace: DNS
Name: google.com
Result: завжди однаковий UUID для google.com
Як безпечно використовувати UUID?
Криптографічна безпека
Наш генератор використовує crypto.getRandomValues(), що є криптографічно безпечним генератором випадкових чисел. На відміну від Math.random(), який є передбачуваним і непридатним для цілей безпеки, crypto.getRandomValues() забезпечує справжню ентропію, придатну для:
- Генерації токенів безпеки
- ID сесій
- Ключів API
- Криптографічних додатків
Порівняння версій UUID
| Версія | Основа | Колізія | Часове сортування | Продуктивність БД | Використання |
|---|---|---|---|---|---|
| v1 | Мітка часу + MAC | Низька | ✅ Так | ❌ Гірше | Застаріле, аудит |
| v3 | MD5 хеш | Жодна (детермінований) | ❌ Ні | ⚠️ Середня | Перетворення (застаріле) |
| v4 | Випадковий | Надзвичайно низька | ❌ Ні | ⚠️ Середня | Загальне використання |
| v5 | SHA-1 хеш | Жодна (детермінований) | ❌ Ні | ⚠️ Середня | Перетворення (рекомендовано) |
| v6 | Упорядкована мітка часу | Низька | ✅ Так | ✅ Краще | Сучасна БД з часом |
| v7 | Unix мітка часу | Низька | ✅ Так | ✅ Найкраще | Нові проєкти |
UUID проти інших ідентифікаторів
| Тип | Розмір | Колізія | Часове сортування | Використання |
|---|---|---|---|---|
| Auto-increment ID | 4-8 байт | Гарантовано унікальний в межах таблиці | ❌ | Прості додатки, локальна БД |
| UUID v4 | 16 байт | Практично неможлива | ❌ | Розподілені системи, API |
| UUID v7 | 16 байт | Практично неможлива | ✅ | Сучасна БД з продуктивністю |
| ULID | 16 байт | Практично неможлива | ✅ | UUID + лексикографічне сортування |
| Snowflake ID | 8 байт | Гарантовано унікальний при правильній конфігурації | ✅ | Twitter, розподілені системи |
| NanoID | Налаштовувана | Залежить від довжини | ❌ | URL-friendly ID |
Реалізація різними мовами програмування
JavaScript/TypeScript
// UUID v4 - Найпростіший спосіб (сучасні браузери)
const uuid = crypto.randomUUID();
// UUID v4 - Ручна реалізація
function generateUUIDv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
const r = (crypto.getRandomValues(new Uint8Array(1))[0] & 0x0f) >> (c === 'x' ? 0 : 2);
const v = c === 'x' ? r : (r & 0x3) | 0x8;
return v.toString(16);
});
}
// UUID v7 - Рекомендовано для баз даних
function generateUUIDv7() {
const timestamp = Date.now();
const timeHi = (timestamp >> 16).toString(16).padStart(8, '0');
const timeLow = (timestamp & 0xFFFF).toString(16).padStart(4, '0');
const randomBytes = crypto.getRandomValues(new Uint8Array(10));
const randomHex = Array.from(randomBytes)
.map(b => b.toString(16).padStart(2, '0'))
.join('');
return `${timeHi}-${timeLow}-7${randomHex.substr(0, 3)}-${randomHex.substr(3, 4)}-${randomHex.substr(7)}`;
}
Python
import uuid
# UUID v4
uuid_v4 = str(uuid.uuid4())
# Output: '6ba7b810-9dad-11d1-80b4-00c04fd430c8'
# UUID v1
uuid_v1 = str(uuid.uuid1())
Java
import java.util.UUID;
// UUID v4
String uuidV4 = UUID.randomUUID().toString();
PHP
// UUID v4 (PHP 7+)
function generateUUID() {
return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
mt_rand(0, 0xffff), mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0x0fff) | 0x4000,
mt_rand(0, 0x3fff) | 0x8000,
mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
);
}
C#
using System;
// UUID v4
Guid uuid = Guid.NewGuid();
string uuidString = uuid.ToString();
Best Practices
Зберігання UUID у базі даних
PostgreSQL:
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
MySQL 8.0+:
CREATE TABLE users (
id BINARY(16) PRIMARY KEY DEFAULT (UUID_TO_BIN(UUID())),
email VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Порада: У MySQL зберігайте UUID як BINARY(16) замість CHAR(36) для економії місця та швидшого індексування.
Валідація UUID
function isValidUUID(uuid) {
const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
return regex.test(uuid);
}
Конвертація UUID
// Видалення дефісів
const compact = uuid.replace(/-/g, '');
// Додавання дефісів назад
function formatUUID(compactUuid) {
return [
compactUuid.substring(0, 8),
compactUuid.substring(8, 12),
compactUuid.substring(12, 16),
compactUuid.substring(16, 20),
compactUuid.substring(20, 32)
].join('-');
}
Вирішення проблем (Troubleshooting)
UUID v3/v5 не працює
Проблема: Після вибору v3 або v5 нічого не генерується
Рішення:
- ✅ Перевірте, що ви заповнили поле “Назва” - воно обов’язкове!
- ✅ Виберіть правильний простір імен відповідно до типу вашого входу
- ✅ Приклади дійсних входів:
- DNS:
example.com,google.com - URL:
https://example.com/page - Будь-який текст:
моя-програма-v1
- DNS:
Порада: Спробуйте спочатку просте значення, як test, та простір імен DNS.
Часовий UUID (v1, v6, v7) має дивний час
Проблема: Згенерований UUID має неочікувану мітку часу
Рішення:
- ✅ Перевірте вибір дати та часу - чи правильно встановлено час?
- ✅ Вибір дати та часу використовує ваш локальний часовий пояс
- ✅ Залиште вибір дати та часу порожнім для поточного часу
UUID неможливо скопіювати
Проблема: Кнопка “Копіювати все” не працює
Рішення:
- ✅ Перевірте, що ви згенерували UUID (вони не порожні)
- ✅ Деякі браузери вимагають HTTPS для API буфера обміну
- ✅ Альтернативно виберіть текст у текстовій області та скопіюйте вручну (Ctrl+C)
Часті питання (FAQ)
Чи може статися колізія UUID?
Теоретично так, але ймовірність астрономічно мала. При генерації 1 мільярда UUID v4 за секунду протягом 100 років шанс колізії становить приблизно 0,00000006%. На практиці колізія ніколи не трапляється.Чи підходить UUID як первинний ключ у базі даних?
Залежить від сценарію використання. UUID ідеально підходить для розподілених систем та ситуацій, коли потрібна глобальна унікальність. Для простих додатків з однією базою даних автоінкремент може бути ефективнішим.Чи безпечні UUID, згенеровані цим інструментом?
Так, ми використовуємо Web Crypto API (`crypto.getRandomValues()`), яке надає криптографічно безпечні випадкові значення. Все відбувається локально у вашому браузері.Яка різниця між версіями UUID?
- **v1**: Мітка часу + MAC/випадковий - хронологічне сортування, гірша продуктивність БД - **v3/v5**: На основі хешу - детермінований, для перетворення відомих ідентифікаторів - **v4**: Випадковий - найбезпечніший, найпоширеніший - **v6**: Переупорядкована мітка часу - краща продуктивність БД, ніж у v1 - **v7**: Unix мітка часу - найкраща продуктивність БД + часове сортуванняЯку версію UUID мені слід використовувати?
У більшості випадків використовуйте **v4** (випадковий). Для баз даних з часовим сортуванням використовуйте **v7** (сучасний) або **v6** (стандарт). Для перетворення відомих ідентифікаторів (URL, DNS) використовуйте **v5** (SHA-1).Чи можу я використовувати UUID для токенів та ключів API?
UUID v4 підходить для ID сесій та подібних токенів. Для ключів API розгляньте використання довших випадкових рядків (наприклад, 256-бітних значень) або спеціалізованих бібліотек.Якого розміру UUID?
UUID має 128 біт (16 байт). У строковому форматі з дефісами він займає 36 символів. Без дефісів - 32 шістнадцяткових символи.Альтернативи UUID
ULID (Universally Unique Lexicographically Sortable Identifier)
- 128-бітний ID (як і UUID)
- Лексикографічно сортується за часом створення
- Компактніше представлення (26 символів замість 36)
- Кодування base32 без урахування регістру
Приклад: 01ARZ3NDEKTSV4RRFFQ69G5FAV
NanoID
- Менший розмір, ніж UUID (стандартно 21 символ)
- URL-friendly (без спеціальних символів)
- Швидша генерація
- Налаштовувана довжина та алфавіт
Приклад: V1StGXR8_Z5jdHi6B-myT
Snowflake ID (Twitter)
- 64-бітний ID (менший, ніж UUID)
- Сортується за часом
- Містить ID воркера та порядковий номер
- Вимагає централізованої конфігурації
Приклад: 1234567890123456789
Продуктивність та оптимізація
Швидкість генерації
Наш генератор може згенерувати:
- 1 UUID: < 1 мс
- 100 UUID: ~10-20 мс
- 1000 UUID: ~100-200 мс
Поради щодо продуктивності
- Пакетна генерація – Якщо вам потрібно багато UUID, генеруйте їх одразу, а не по одному
- Зберігання в БД – Індексуйте стовпці UUID для швидкого пошуку
- Компресія – Зберігайте UUID у бінарному вигляді (16 байт) замість рядка (36 байт)
- Кешування – У деяких випадках ви можете попередньо генерувати та кешувати UUID
Для розробників
Структура UUID v4
xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
| | | | |
| | | | └─ 48 бітів випадкових даних (node)
| | | └────── 16 бітів випадкових даних з варіантом (clock_seq)
| | └─────────── 12 бітів випадкових даних + 4 біти версії (time_hi_and_version)
| └──────────────── 16 бітів випадкових даних (time_mid)
└───────────────────────── 32 біти випадкових даних (time_low)
- Версія (4 біти): завжди
0100(двійково) =4(шістнадцятково) - Варіант (2-3 біти): завжди
10(двійково) для RFC 4122
Тестування UUID
// Jest test
describe('UUID Generator', () => {
test('generates valid UUID v4', () => {
const uuid = generateUUIDv4();
const regex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
expect(regex.test(uuid)).toBe(true);
});
test('generates unique UUIDs', () => {
const uuid1 = generateUUIDv4();
const uuid2 = generateUUIDv4();
expect(uuid1).not.toBe(uuid2);
});
});
Аспекти безпеки
Чого не слід робити з UUID
❌ Не використовуйте UUID v1 для чутливих додатків – Він містить мітку часу, що може бути ризиком безпеки
❌ Не використовуйте Math.random() для генерації UUID – Він не є криптографічно безпечним
❌ Не покладайтесь на UUID для авторизації – UUID можна вгадати (хоча з надзвичайно малою ймовірністю)
❌ Не зберігайте UUID у файлах cookie без шифрування – Використовуйте signed cookies або JWT
Що слід робити
✅ Використовуйте UUID v4 для більшості випадків – Найвища ентропія та безпека
✅ Поєднуйте UUID з іншими заходами безпеки – Для управління сесіями використовуйте HTTPS, HttpOnly cookies та короткий термін дії
✅ Валідуйте UUID на сервері – Завжди перевіряйте формат та версію UUID
✅ Використовуйте криптографічно безпечні джерела випадковості – crypto.getRandomValues() у браузері, /dev/urandom на Linux
Цікаві факти
- Кількість можливих UUID v4: 2^122 ≈ 5.3 × 10^36 (340 ундециліонів)
- Необхідна колізія: Для 50% шансу колізії потрібно згенерувати 2.71 × 10^18 UUID (2.71 квінтильйонів)
- Розмір усіх можливих UUID: Якщо б ми зберегли кожен UUID як 16 байт, весь простір зайняв би 85 зеттабайт (85 мільярдів терабайт)
- Походження: UUID було стандартизовано як частина DCE (Distributed Computing Environment) у 1990 році