Skip to content

Feature Ulid

github-actions[bot] edited this page Jul 15, 2026 · 1 revision

🌀 ULID

← Возможности · Главная · Сравнение

Сортируемый 128-битный идентификатор: 48 бит миллисекунд + 80 бит случайности, 26 символов Crockford Base32 — без похожих символов (I, L, O, U), регистронезависимый разбор, монотонный режим из коробки.

Принцип работы

use CloudCastle\Uuid\Ulid;
use CloudCastle\Uuid\UlidFactory;

Ulid::generate()->toString();        // '01ARYZ6S41TSV4RRFFQ69G5FAV'

$factory = new UlidFactory();
$a = $factory->generate();
$b = $factory->generate();
$a->compareTo($b);                   // -1 — монотонно даже в одну мс

$ulid = Ulid::fromString('01arYz6s41tsv4rrffq69g5fav');  // регистр любой
$ulid->timestampMs();                // 1469918176385
$ulid->dateTime();                   // DateTimeImmutable UTC
$ulid->randomness();                 // 10 байт случайной части
$ulid->toBytes();                    // 16 байт — BINARY(16)
$ulid->toLower();                    // нижний регистр для URL

Монотонный режим — инкремент случайной части в пределах миллисекунды (спецификация ulid/spec); переполнение 80 бит переносит генерацию в следующую миллисекунду. Явный момент (generate($at)) — чистая функция без влияния на монотонное состояние.

Плюсы

  • Строковый порядок = порядку создания: годен и для URL, и для индексов.
  • Байтовая модель: toBytes() и мост в UUID без перекодирования.
  • Полная валидация: переполнение 48-битного времени и запрещённые символы отклоняются.

Минусы

  • Разбор строки в объект медленнее robinvdvleuten: он хранит подстроки без декодирования и валидации диапазона — мы сразу материализуем 16 байт (см. сравнение).

✅ Рекомендуется

  • Идентификаторы в URL и файлах: короче UUID, без похожих символов.
  • Ключи БД с сортировкой по времени без отдельной колонки.

❌ Антипаттерны

  • Обрезка ULID до «короткого ID» — время в старших символах перестаёт быть уникальным.

Схема фичи

flowchart LR
    C["Часы (PSR-20/microtime)"] -->|"48 бит мс"| F[UlidFactory]
    R[RandomSource] -->|"80 бит"| F
    F -->|"монотонный инкремент<br/>в пределах мс"| U[Ulid]
    U --> S["Crockford Base32 (26)"]
    U --> B["16 байт"]
Loading

Жизненный цикл

sequenceDiagram
    participant A as Приложение
    participant F as UlidFactory

    A->>F: generate()
    F->>F: мс новая? → свежие 80 бит случайности
    F->>F: та же? → случайность + 1 (переполнение → мс + 1)
    F-->>A: Ulid — строго больше предыдущего
Loading

Сравнение с аналогами

Возможность Uuid symfony/uid robinvdvleuten/ulid 🏆 Победитель
Генерация ULID Паритет
Монотонный режим Uuid + symfony/uid
Бинарная форма Uuid + symfony/uid
Валидация переполнения времени Uuid + symfony/uid
PSR-20 часы Uuid
Скорость: генерация до строки 🥇 🥈 🥉 Uuid
Скорость: генерация до 16 байт 🥇 🥈 Uuid

Clone this wiki locally