Реализация 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