Skip to content

Repository files navigation

ulid

OpenYellow telegram chat Ask DeepWiki

Реализация ULID для OneScript - 128-битный идентификатор, который сортируется по времени создания.

ULID решает главные неудобства UUID v4: значения располагаются в порядке создания (нет фрагментации индексов БД), представление короче на 10 символов, читаемо и безопасно для URL.

 01ARZ3NDEK    TSV4RRFFQ69G5FAV

|----------|  |----------------|
 время 48 бит   случайность 80 бит

Установка

opm install ulid

Использование

Генерация

#Использовать ulid

Идентификатор = ULID.Сгенерировать();

Сообщить(Идентификатор.ВСтроку());              // 01KZ6YEDDC1A5N6SJFE7411R7T
Сообщить(Идентификатор.Время());                // 04.08.2026 17:52:31
Сообщить(Идентификатор.ВремяВМиллисекундах());  // 1785865951628

// Сразу строкой, если объект не нужен
Ключ = ULID.СгенерироватьСтроку();

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

Разбор и проверка

Идентификатор = ULID.Разобрать("01ARYZ6S41TSV4RRFFQ69G5FAV");

Сообщить(Идентификатор.ВремяВМиллисекундах());  // 1469918176385
Сообщить(Идентификатор.ВUUID());                // 01563df1-1a41-...

// Разбор регистронезависим
ULID.Разобрать("01aryz6s41tsv4rrffq69g5fav");

// Проверка без исключений
Если ULID.ЭтоКорректный(ЗначениеИзЗапроса) Тогда
    ...
КонецЕсли;

Отдельный генератор

Глобальная последовательность общая на весь процесс. Если нужна независимая - создайте свой генератор:

// Монотонный (по умолчанию)
Генератор = ULID.СоздатьГенератор();
Первый = Генератор.СледующаяСтрока();

// Без гарантии монотонности - случайная часть каждый раз новая
Случайный = ULID.СоздатьГенератор(Ложь);

// Воспроизводимая метка времени: удобно в тестах и при импорте данных
Исторический = Генератор.СледующаяСтрока(1469918176385);

Публичный API

Модуль ULID

Метод Возвращает Описание
Сгенерировать(ВремяВМиллисекундах = Неопределено) UlidValue Новый идентификатор
СгенерироватьСтроку(ВремяВМиллисекундах = Неопределено) Строка Новый идентификатор сразу строкой
Разобрать(Значение) UlidValue Разбор строки (26 символов) или 16 байт
ЭтоКорректный(Значение) Булево Проверка без выброса исключения
ВремяВМиллисекундах(Значение) Число Метка времени Unix из представления
Время(Значение) Дата Момент создания в UTC
СоздатьГенератор(РежимМонотонности = Истина) UlidGenerator Независимая последовательность

Класс UlidValue

ВСтроку(), ВремяВМиллисекундах(), Время(), СлучайнаяЧасть(), ВБуферДвоичныхДанных(), ВДвоичныеДанные(), ВUUID(), Сравнить(Другой), Равен(Другой).

Метод Сравнить принимает как объект, так и строку. ВUUID даёт те же 128 бит в каноническом формате UUID - это удобно для колонок uniqueidentifier, но полем версии UUID такое значение не управляет.

Класс UlidGenerator

Следующий(ВремяВМиллисекундах = Неопределено), СледующаяСтрока(ВремяВМиллисекундах = Неопределено).

Соответствие спецификации

  • Каноническое представление - 26 символов Crockford's Base32 (0123456789ABCDEFGHJKMNPQRSTVWXYZ, без I, L, O, U).
  • Разбор регистронезависим.
  • Значения больше 128 бит отвергаются: максимум - 7ZZZZZZZZZZZZZZZZZZZZZZZZZ (метка времени 281474976710655).
  • Монотонность: в пределах одной миллисекунды случайная часть увеличивается на единицу; при переполнении выбрасывается исключение.
  • Двоичное представление - 16 байт, старший байт первым.
  • Случайность берётся из УникальныйИдентификатор (GUID v4 от криптопровайдера ОС); константные поля версии и варианта из энтропии исключены.

Явно заданная метка времени всегда используется как есть - генерация воспроизводима. Для автоматической метки последовательность продолжается даже при переводе системных часов назад, чтобы порядок не нарушался.

Тесты

opm install -l
oneunit execute -d ./tests

Лицензия

MIT

About

Сортируемые по времени 128-битные идентификаторы: 48 бит времени, 80 бит случайности, Crockford Base32

Topics

Resources

Contributing

Stars

3 stars

Watchers

0 watching

Forks

Releases

Used by

Contributors

Languages