Сортируемые по времени 128-битные идентификаторы: 48 бит времени, 80 бит случайности, Crockford's Base32.
Пакет лежит в основном пуле хаба, а opm знает этот хаб по умолчанию: короткой формы достаточно.
opm install ulidСкачанный файл ставится командой opm install -f <файл> — сеть для этого уже не нужна.
Описание
ulid
Реализация 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