UUID та ULID
Lift\Support\Uuid генерує криптографічно безпечні ідентифікатори. Усі формати використовують random_bytes() для своєї випадкової складової.
Формати з одного погляду
| Формат | Довжина | Сортовний | Сценарій використання |
|---|---|---|---|
| UUID v4 | 36 символів | Ні | Загальне призначення, максимальна сумісність |
| UUID v7 | 36 символів | Так | Первинні ключі БД, розподілені ID, логи |
| ULID | 26 символів | Так | Людиночитаний, безпечний для URL, компактний |
UUID v4 — випадковий
122 біти криптографічної випадковості. Жодної часової складової — максимально непрозорий.
use Lift\Support\Uuid;
$id = Uuid::v4();
// наприклад, "550e8400-e29b-41d4-a716-446655440000"
UUID v7 — упорядкований за часом
Перші 48 бітів кодують Unix-мітку часу з мілісекундною точністю. Наступні значення UUIDv7 сортуються лексикографічно, що робить їх ідеальними для первинних ключів бази даних (дружні до B-дерева, без фрагментації індексу).
$id = Uuid::v7();
// наприклад, "018f8e0d-1c2a-7xxx-xxxx-xxxxxxxxxxxx"
// ^^^^^^^^ префікс мс-мітки часу
// З конкретною міткою часу (корисно для тестів)
$id = Uuid::v7(ms: 1_718_700_000_000);
Схема бази даних
-- MySQL / MariaDB
CREATE TABLE users (
id BINARY(16) NOT NULL PRIMARY KEY DEFAULT (UUID_TO_BIN(UUID(), 1)),
-- або зберігати як CHAR(36), якщо BINARY(16) надто незручний
name VARCHAR(255) NOT NULL
);
Зберігайте як BINARY(16), використовуючи бінарні помічники:
// Зберегти
$binary = Uuid::toBinary(Uuid::v7());
// Отримати
$uuid = Uuid::fromBinary($row['id']);
ULID — Universally Unique Lexicographically Sortable Identifier
26-символьний рядок Crockford base32. 10-символьний часовий префікс (мс-точність) + 16-символьний випадковий суфікс.
Переваги над UUID:
- 26 проти 36 символів — компактніший
- Без дефісів — чистіший в URL, логах і виводі CLI
- Регістронезалежний
- Виключає неоднозначні символи (I, L, O, U)
$id = Uuid::ulid();
// наприклад, "01ARZ3NDEKTSV4RRFFQ69G5FAV"
// Конкретна мітка часу
$id = Uuid::ulid(ms: 1_718_700_000_000);
Валідація
Uuid::isValid('550e8400-e29b-41d4-a716-446655440000'); // true
Uuid::isValid('not-a-uuid'); // false
Uuid::isValidUlid('01ARZ3NDEKTSV4RRFFQ69G5FAV'); // true
Uuid::isValidUlid('INVALID'); // false
isValid() приймає версії UUID 1–8 (регістронезалежно).
Бінарне кодування
Зберігайте UUID ефективно у стовпці BINARY(16) (половина обсягу сховища від CHAR(36)):
// Під час запису
$binary = Uuid::toBinary($uuid); // 16 сирих байтів
// Під час читання
$uuid = Uuid::fromBinary($binary); // назад у "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Вибір правильного формату
Новий проєкт, первинні ключі БД? → UUID v7 (сортовний, дружній до B-дерева)
URL-слаги, кореляційні ID логів? → ULID (компактний, безпечний для URL)
Сумісність з наявними UUID? → UUID v4