Генератор ULID: сортируемые идентификаторы

26-символьные сортируемые ID: время плюс 80 случайных бит.

Как устроен ULID

ULID — это 128 бит: 48 бит времени в миллисекундах и 80 бит случайности. В тексте он занимает 26 символов Crockford Base32: первые 10 кодируют время, остальные 16 — случайную часть. Алфавит намеренно без I, L, O и U: их легко спутать с единицей, нулём и друг другом при чтении с экрана.

Версии и варианта, как у UUID, здесь нет — это другое семейство. Зато есть сортируемость: строки, созданные раньше, сравниваются как меньшие. Для первичных ключей это даёт локальность вставки в B-tree, которой не хватает случайному UUID v4.

Монотонность внутри партии

В одну миллисекунду можно создать тысячи значений, и у них совпадёт время. Чтобы порядок не ломался, генератор увеличивает случайную часть для каждого следующего значения: партия получается строго возрастающей. Формально это свойство реализации, а не гарантия стандарта, но для практических задач — ровно то, что нужно.

Где хранить

В PostgreSQL ULID кладут в char(26) или в бинарное поле, но не в тип uuid: это разные форматы, хотя оба 128-битные. В MySQL и SQL Server 16 байт бинарного представления дешевле по индексу, чем 26 символов текста; выбор зависит от того, что важнее — читаемость в консоли или размер индекса.

ULID раскрывает приблизительное время создания. Если это нежелательно, для публичных ссылок лучше подходит UUID v4 или NanoID.

Частые вопросы

Чем ULID отличается от UUID v7?

Оба 128-битные и сортируемые. ULID — 48 бит времени и 80 случайных в 26 символах Base32; v7 — стандарт RFC с 74 битами на случайность и 36 символами.

Почему в алфавите нет I, L, O, U?

Crockford Base32 убирает символы, которые путают при чтении: I и L с 1, O с 0, U с V.

ULID монотонный?

В пределах одной партии — да: при совпадении миллисекунды случайная часть увеличивается, поэтому значения возрастают и сортируются как строки.

Проверено: 26 октября 2026. Расчёт справочный, итог зависит от материала и навыка мастера.