Skip to content

Instantly share code, notes, and snippets.

@sergey-shambir
Last active November 7, 2024 18:32
Show Gist options
  • Select an option

  • Save sergey-shambir/3ca06ad1a8807a0a227efbf7f67450d6 to your computer and use it in GitHub Desktop.

Select an option

Save sergey-shambir/3ca06ad1a8807a0a227efbf7f67450d6 to your computer and use it in GitHub Desktop.
Генерация UUIDv7 средствами встроенного языка 1С (проверено в onescript)
#Использовать "./Утилиты"
Сообщить("Новый UUIDv4, 1 штука: ");
Сообщить(Новый УникальныйИдентификатор);
Сообщить("");
Сообщить("Новый UUIDv7, 5 штук: ");
Сообщить(UUID.НовыйПоследовательныйUUID());
Сообщить(UUID.НовыйПоследовательныйUUID());
Сообщить(UUID.НовыйПоследовательныйUUID());
Сообщить(UUID.НовыйПоследовательныйUUID());
Сообщить(UUID.НовыйПоследовательныйUUID());
// Преобразует число в 16-ричную строку заданной длины,
// например для Число=36775 и Длина=8 результат будет "00008fa7"
Функция СтрШестнадцатеричнаяИзЧисла(Число, Длина)
Результат = Новый Массив(Длина);
Шаблон = "0123456789abcdef";
Основание = СтрДлина(Шаблон);
Для ОбратныйИндекс = 1 По Длина Цикл
Остаток = Число % Основание;
Число = (Число - Остаток) / Основание;
Результат[Длина - ОбратныйИндекс] = Сред(Шаблон, Остаток + 1, 1);
КонецЦикла;
Возврат СтрСоединить(Результат);
КонецФункции
// Преобразует 16-ричную строку в число,
// например "8fa7" в 36775
Функция ЧислоИзСтрШестнадцатеричной(Строка)
Шаблон = "0123456789abcdef";
Основание = СтрДлина(Шаблон);
Результат = 0;
Для Номер = 1 По СтрДлина(Строка) Цикл
Результат = Основание * Результат + СтрНайти(Шаблон, Сред(Строка, Номер, 1)) - 1;
КонецЦикла;
Возврат Результат;
КонецФункции
// Генерирует массив случайных 16-ричных цифр с заданной длиной.
Функция МассивШестнадцатеричныйСлучайный(Длина)
ГСЧ = Новый ГенераторСлучайныхЧисел();
Результат = Новый Массив(Длина);
Шаблон = "0123456789abcdef";
Основание = СтрДлина(Шаблон);
Для Индекс = 0 По Длина - 1 Цикл
Результат[Индекс] = Сред(Шаблон, ГСЧ.СлучайноеЧисло(1, Основание), 1);
КонецЦикла;
Возврат Результат;
КонецФункции
// Генерирует новый последовательно возрастающий UUID,
// соответствующий варианту UUIDv7 (из черновика стандарта).
//
// См. https://www.rfc-editor.org/rfc/rfc9562#name-uuid-version-7
//
// Структура UUIDv7:
//
// 0190163d-8694-739b-aea5-966c26f8ad91
// └─timestamp─┘ │└─┤ │└───rand_b─────┘
// ver┘ │ └var
// rand_a
//
// Описание полей UUIDv7:
// ┌────────────┬─────────┬───────────────────────────────────────┐
// │ Поле │ Размер │ Описание │
// ├────────────┼─────────┼───────────────────────────────────────┤
// │ timestamp │ 48 бит │ UNIX Timestamp в миллисекундах │
// │ ver │ 4 бита │ Версия, всегда 7 │
// │ rand_a │ 12 бит │ Случайное значение │
// │ var │ 2 бита │ Вариант, всегда 0b10 (двоичное число) │
// │ rand_b │ 62 бита │ Случайное значение │
// └────────────┴─────────┴───────────────────────────────────────┘
Функция НовыйПоследовательныйUUID() Экспорт
// Функция вернёт число миллисекунд с полуночи 1 января 0001 года,
// А UNIX Timestamp исчисляется с 1 января 1970 года
ДатаВМиллисекундах = ТекущаяУниверсальнаяДатаВМиллисекундах() - 62135596800000;
Голова = СтрШестнадцатеричнаяИзЧисла(ДатаВМиллисекундах, 12);
// Сначала создаём массив и заполняем его случайными цифрами
СимволыХвоста = МассивШестнадцатеричныйСлучайный(20);
СимволыХвоста[0] = "7"; // Версия UUIDv7.
СимволыХвоста[4] = СтрШестнадцатеричнаяИзЧисла(8 + ЧислоИзСтрШестнадцатеричной(СимволыХвоста[4]) % 4, 1);
Хвост = СтрСоединить(СимволыХвоста);
Возврат Сред(Голова, 1, 8) + "-" + Сред(Голова, 9, 4) + "-" + Сред(Хвост, 1, 4) + "-" + Сред(Хвост, 5, 4) + "-" + Сред(Хвост, 9, 12);
КонецФункции
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment