Last active
November 7, 2024 18:32
-
-
Save sergey-shambir/3ca06ad1a8807a0a227efbf7f67450d6 to your computer and use it in GitHub Desktop.
Генерация UUIDv7 средствами встроенного языка 1С (проверено в onescript)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #Использовать "./Утилиты" | |
| Сообщить("Новый UUIDv4, 1 штука: "); | |
| Сообщить(Новый УникальныйИдентификатор); | |
| Сообщить(""); | |
| Сообщить("Новый UUIDv7, 5 штук: "); | |
| Сообщить(UUID.НовыйПоследовательныйUUID()); | |
| Сообщить(UUID.НовыйПоследовательныйUUID()); | |
| Сообщить(UUID.НовыйПоследовательныйUUID()); | |
| Сообщить(UUID.НовыйПоследовательныйUUID()); | |
| Сообщить(UUID.НовыйПоследовательныйUUID()); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // Преобразует число в 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