Реализация 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);| Метод | Возвращает | Описание |
|---|---|---|
Сгенерировать(ВремяВМиллисекундах = Неопределено) |
UlidValue |
Новый идентификатор |
СгенерироватьСтроку(ВремяВМиллисекундах = Неопределено) |
Строка |
Новый идентификатор сразу строкой |
Разобрать(Значение) |
UlidValue |
Разбор строки (26 символов) или 16 байт |
ЭтоКорректный(Значение) |
Булево |
Проверка без выброса исключения |
ВремяВМиллисекундах(Значение) |
Число |
Метка времени Unix из представления |
Время(Значение) |
Дата |
Момент создания в UTC |
СоздатьГенератор(РежимМонотонности = Истина) |
UlidGenerator |
Независимая последовательность |
ВСтроку(), ВремяВМиллисекундах(), Время(), СлучайнаяЧасть(), ВБуферДвоичныхДанных(), ВДвоичныеДанные(), ВUUID(), Сравнить(Другой), Равен(Другой).
Метод Сравнить принимает как объект, так и строку. ВUUID даёт те же 128 бит в каноническом формате UUID - это удобно для колонок uniqueidentifier, но полем версии UUID такое значение не управляет.
Следующий(ВремяВМиллисекундах = Неопределено), СледующаяСтрока(ВремяВМиллисекундах = Неопределено).
- Каноническое представление - 26 символов Crockford's Base32 (
0123456789ABCDEFGHJKMNPQRSTVWXYZ, безI,L,O,U). - Разбор регистронезависим.
- Значения больше 128 бит отвергаются: максимум -
7ZZZZZZZZZZZZZZZZZZZZZZZZZ(метка времени281474976710655). - Монотонность: в пределах одной миллисекунды случайная часть увеличивается на единицу; при переполнении выбрасывается исключение.
- Двоичное представление - 16 байт, старший байт первым.
- Случайность берётся из
УникальныйИдентификатор(GUID v4 от криптопровайдера ОС); константные поля версии и варианта из энтропии исключены.
Явно заданная метка времени всегда используется как есть - генерация воспроизводима. Для автоматической метки последовательность продолжается даже при переводе системных часов назад, чтобы порядок не нарушался.
opm install -l
oneunit execute -d ./tests