-
-
Notifications
You must be signed in to change notification settings - Fork 0
Feature Ulid
github-actions[bot] edited this page Jul 15, 2026
·
1 revision
Сортируемый 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 байт"]
sequenceDiagram
participant A as Приложение
participant F as UlidFactory
A->>F: generate()
F->>F: мс новая? → свежие 80 бит случайности
F->>F: та же? → случайность + 1 (переполнение → мс + 1)
F-->>A: Ulid — строго больше предыдущего
| Возможность | Uuid | symfony/uid | robinvdvleuten/ulid | 🏆 Победитель |
|---|---|---|---|---|
| Генерация ULID | ✅ | ✅ | ✅ | Паритет |
| Монотонный режим | ✅ | ✅ | ❌ | Uuid + symfony/uid |
| Бинарная форма | ✅ | ✅ | ❌ | Uuid + symfony/uid |
| Валидация переполнения времени | ✅ | ✅ | ❌ | Uuid + symfony/uid |
| PSR-20 часы | ✅ | ❌ | ❌ | Uuid |
| Скорость: генерация до строки | 🥇 | 🥈 | 🥉 | Uuid |
| Скорость: генерация до 16 байт | 🥇 | 🥈 | — | Uuid |
CloudCastle Uuid · · PHP 8.1+
GitHub · Packagist · Releases · Discussions · Issues
Email · Telegram · VK · Сетка · 💜 Поддержать проект
Исходники Wiki — каталог wiki/ в репозитории (синхронизация через GitHub Actions)