Генератор 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 за часом створення запису
  • Ретроактивна генерація ідентифікаторів

Приклад використання:

  1. Виберіть версію v1, v6 або v7
  2. Встановіть дату та час за допомогою вибору дати та часу
  3. Згенеруйте UUID з вашою власною міткою часу

UUID на основі хешу (v3, v5)

Для детермінованих UUID ви можете використовувати версії v3 (MD5) або v5 (SHA-1):

Як використовувати:

  1. Виберіть простір імен відповідно до типу вашого ідентифікатора
  2. Введіть назву/значення
  3. Згенеруйте UUID

Приклади:

Простір іменНазва (ввід)Використання
DNSexample.comПеретворення доменного імені на UUID
DNSgoogle.comКожен вебсайт має унікальний UUID
URLhttps://example.com/pageПеретворення URL на UUID
URLhttps://api.example.com/users/123Кінцева точка API як UUID
OID1.3.6.1.4.1.343Ідентифікатор об’єкта на UUID
X.500CN=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Низька✅ Так❌ ГіршеЗастаріле, аудит
v3MD5 хешЖодна (детермінований)❌ Ні⚠️ СередняПеретворення (застаріле)
v4ВипадковийНадзвичайно низька❌ Ні⚠️ СередняЗагальне використання
v5SHA-1 хешЖодна (детермінований)❌ Ні⚠️ СередняПеретворення (рекомендовано)
v6Упорядкована мітка часуНизька✅ Так✅ КращеСучасна БД з часом
v7Unix мітка часуНизька✅ Так✅ НайкращеНові проєкти

UUID проти інших ідентифікаторів

ТипРозмірКолізіяЧасове сортуванняВикористання
Auto-increment ID4-8 байтГарантовано унікальний в межах таблиціПрості додатки, локальна БД
UUID v416 байтПрактично неможливаРозподілені системи, API
UUID v716 байтПрактично неможливаСучасна БД з продуктивністю
ULID16 байтПрактично неможливаUUID + лексикографічне сортування
Snowflake ID8 байтГарантовано унікальний при правильній конфігурації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 нічого не генерується

Рішення:

  1. ✅ Перевірте, що ви заповнили поле “Назва” - воно обов’язкове!
  2. ✅ Виберіть правильний простір імен відповідно до типу вашого входу
  3. ✅ Приклади дійсних входів:
    • DNS: example.com, google.com
    • URL: https://example.com/page
    • Будь-який текст: моя-програма-v1

Порада: Спробуйте спочатку просте значення, як test, та простір імен DNS.

Часовий UUID (v1, v6, v7) має дивний час

Проблема: Згенерований UUID має неочікувану мітку часу

Рішення:

  1. ✅ Перевірте вибір дати та часу - чи правильно встановлено час?
  2. ✅ Вибір дати та часу використовує ваш локальний часовий пояс
  3. ✅ Залиште вибір дати та часу порожнім для поточного часу

UUID неможливо скопіювати

Проблема: Кнопка “Копіювати все” не працює

Рішення:

  1. ✅ Перевірте, що ви згенерували UUID (вони не порожні)
  2. ✅ Деякі браузери вимагають HTTPS для API буфера обміну
  3. ✅ Альтернативно виберіть текст у текстовій області та скопіюйте вручну (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 мс

Поради щодо продуктивності

  1. Пакетна генерація – Якщо вам потрібно багато UUID, генеруйте їх одразу, а не по одному
  2. Зберігання в БД – Індексуйте стовпці UUID для швидкого пошуку
  3. Компресія – Зберігайте UUID у бінарному вигляді (16 байт) замість рядка (36 байт)
  4. Кешування – У деяких випадках ви можете попередньо генерувати та кешувати 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 році