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() - тобто на тому самому криптографічному джерелі випадковості, що й у бекенді.
- Де виконується
- у браузері
- Категорія
- Хеші й безпека