Lift v1.3.0

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