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