Skip to content

Repository files navigation

ulid

telegram chatAsk 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

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages