Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас

UUID і ULID

Згенерувати UUID v4 або ULID

Дані не залишають ваш браузер

Цей інструмент повністю працює на вашому пристрої: обчислення виконує JavaScript у вкладці. Ми не надсилаємо введений текст на сервер, не зберігаємо і не логуємо його. Можете сміливо працювати з робочими даними - і навіть відключити інтернет після завантаження сторінки.

Поділитись

UUID і ULID - два способи мати унікальний ідентифікатор

Обидва дозволяють згенерувати id до запису в базу і не залежати від автоінкремента. Це критично для розподілених систем, офлайн-клієнтів і випадків, коли id треба знати заздалегідь.

Різниця в одному: ULID сортується за часом створення, UUID v4 - ні.

UUID v4:  9f8b2c1e-4d3a-4b7c-8e1f-2a3b4c5d6e7f   (36 символів, випадковий)
ULID:     01JBQZX5K8P3M7NRTVWY9CDEFG              (26 символів, час + випадковість)

Чому це важливо для бази

UUID v4 повністю випадковий, тому кожен новий рядок потрапляє у випадкове місце індексу. На великій таблиці це призводить до фрагментації B-дерева і помітно повільніших вставок.

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

Практичне правило: якщо id стає первинним ключем - беріть ULID. Якщо це просто випадковий токен без зв'язку з базою - UUID v4 підходить.

Публічний id ≠ первинний ключ

Послідовні числові id розкривають зайве: конкурент бачить, скільки у вас замовлень, і чи ростуть вони. Це називають перерахуванням ресурсів.

Але замінювати первинний ключ - не єдиний вихід. Часто розумніше лишити id як bigint для зв'язків, а назовні показувати окремий uuid-стовпець.

У Laravel

// Генерація
Str::uuid();      // UUID v4
Str::orderedUuid();  // UUID, впорядкований за часом - аналог ідеї ULID
Str::ulid();
// Модель на ULID як первинному ключі
use Illuminate\Database\Eloquent\Concerns\HasUlids;

class Order extends Model
{
    use HasUlids;
}

// Міграція
$table->ulid('id')->primary();
// Окремий публічний ключ поруч зі звичайним id
$table->id();
$table->uuid('public_id')->unique();

// І прив'язка маршруту саме до нього
public function getRouteKeyName(): string
{
    return 'public_id';
}

Типи стовпців

Не зберігайте UUID у varchar(36), якщо база вміє краще: PostgreSQL має рідний тип uuid (16 байтів замість 36), MySQL - binary(16). На мільйонах рядків різниця в розмірі індексу відчутна.

Генерація тут відбувається у вашому браузері через crypto.randomUUID() та crypto.getRandomValues() - тобто на тому самому криптографічному джерелі випадковості, що й у бекенді.