Как сделать свой guid
Если вдруг нужно быстро сгенерить символьные ID, которые представляют собой сочетание цифр и символов, при этом вам не нужна высокая надежность и коллизии вам не страшны, то можно сделать это очень быстро следующим образом:
Можно так же сделать генерацию хешей от времени:
Только не стоит использовать такой подход для генерации сесионных ID и прочих секурных дел. Такое может пригодится, если нужно заполнить что-то рандомными значениями, сгенерить объект с рандомными ключами и так далее.
Генерация UUID
UUID (universally unique identifier) — это стандарт идентификации, используемый в создании программного обеспечения, стандартизированный Open Software Foundation. Основное назначени— позволить распределённым системам уникально идентифицировать информацию без центра координации. Наиболее распространённым использованием данного стандарта является реализация Globally Unique Identifier (GUID).
Общее количество уникальных ключей UUID составляет 2128 = 25616 или около 3,4 × 1038. Это означает, что генерируя 1 триллион ключей каждую наносекунду, перебрать все возможные значения удастся лишь за 10 миллиардов лет.
Собственно теперь вопрос, как сгенерить данную строку на JS. Вариант реализации:
Для уменьшения коллизийи и улучшения криптонадежности можно использовать Crypto API:
Код ([1e7]+-1e3+-4e3+-8e3+-1e11) формирует строку "10000000-1000-4000-8000-100000000000". Далее .replace(/[018]/g - пробегаемся по символам, и с каждым 0, 1 и 8 производим манипуляции. Затем сдвиг: 15 >> c/4 - 0,1,8 => 15,15,3 после чего вызываем crypto.getRandomValues(new Uint8Array(1))[0] - генерим случайное число в диапазоне 0..255. Вызов crypto.getRandomValues(new Uint8Array(1))[0]&15 >> c/4 - это не что иное как побитовое И, этот код сужает диапазон 0..255 до 0..15 или 0..3, если с=8. Вызов c^crypto.getRandomValues(new Uint8Array(1))[0]&15 >> c/4 - ноль или один, или 8 черех XOR обрабатываются с предыдущим шагом. Полученный результат переводим в шестнадцатеричный формат и возвращаем вместо символа. Сдвиг и xor в данном коде нужны для большей энтропии.
Генерация GUID
GUID — это разновидность UUID и его особенность заключается в формате. Так что при необходимости не составит труда переделать формат функции под GUID.
У меня есть файл excel с одним порядком в каждой строке, и я хочу, чтобы каждый заказ имел уникальный идентификатор, поэтому будет столбец Unique ID. Каждый раз, когда я заполняю строку, я хочу, чтобы Excel автоматически заполнял столбец "Уникальный идентификатор" для меня. Я сделал некоторые исследования и был указан в направлении GUID. Я нашел следующий код:
но я не уверен, как это реализовать. Любая помощь будет принята с благодарностью. Заранее благодарю вас.
ОТВЕТЫ
Ответ 1
В следующем выражении Excel используется идентификатор GUID V4:
-or (в зависимости от настроек локали/десятичных и разделителей списков) -
Обратите внимание, что первый символ третьей группы всегда равен 4, чтобы обозначить V4 (генерируемый псевдослучайным числом) GUID/UUID для RFC 4122, раздел 4.4.
Также обратите внимание, что первый символ четвертой группы всегда находится между 8 и B в одном RFC.
Стандартный отказ от ответственности: результирующие GUID/UUID не являются криптографически сильными.
Ответ 2
Я использовал следующую функцию в v.2013 excel vba для создания GUID и хорошо работает.
Ответ 3
Не тестировались, но этот код, похоже, использует Windows API для получения своего GUID - я бы поставил его в открытый модуль и набрав =GetGUId() в ячейке Excel, чтобы посмотреть, что я получу. Если он работает в VB6, у вас есть много шансов, что он работает и в VBA:
Спасибо Гус Молина!
Если этот код работает (что я не сомневаюсь), я думаю, что вы получите новый набор GUID всякий раз, когда функция будет оцениваться, что означает, что каждый раз, когда лист вычисляется - когда вы сохраняете книгу, для пример. Обязательно скопируйте-pastespecial-values, если вам нужен GUID для последующего использования. что несколько вероятно.
Ответ 4
Ответ 5
То же самое для немецкой версии Excel:
Ответ 6
Подход VBA, основанный на генерации случайных чисел с использованием функции Rnd() , а не на внешних вызовах API или Scriptlet.TypeLib :
Это, по сути, реализация VBA ответа NekojiruSou (он также генерирует GUID v4) и имеет те же ограничения, но будет работать в VBA и может быть проще реализовать.
Обратите внимание, что вы можете опустить последнюю строку, чтобы не возвращать тире и фигурные скобки в результате.
Ответ 7
Поскольку обновление Windows вывело "Scriptlet.TypeLib", попробуйте следующее:
С другой стороны,
если вы подключаетесь к SQL Server 2008 или выше, попробуйте вместо этого использовать функцию SQL NEWID().
Ответ 8
Если вы вставляете записи в базу данных, вы можете использовать этот способ для создания GUID.
Это, вероятно, самый простой и простой способ реализовать, поскольку вам не нужна сложная функция VBA , поскольку вы используете встроенную функцию SQL.
В заявлении используются NewID() ,
Синтаксис выглядит следующим образом:
В синтаксисе VBA он выглядит следующим образом:
И если вам нужно конкатенировать значения, просто рассматривайте его как строку и конкатенацию, как обычно для оператора SQL,
Ответ 9
Недавно я столкнулся с проблемами с использованием CreateObject ( "Scriptlet.TypeLib" ) в некотором коде vba.
Итак, на основе функций excel NekojiruSou написано следующее, которое должно работать без каких-либо особых функций excel. Это можно использовать для разработки пользовательской функции в excel.
Для получения уникального идентификатора объекта, используйте код вида:
Код 1C v 8.х
В 1С 7.7 можно получить так
Через v7plus.dll
Код 1C v 7.x
Через WScript
Код 1C v 7.x
при OLE доступе:
Код 1C v 7.x
Еще посмотрите метод:
ЗначениеВСтрокуВнутр( );
Синтаксис:
ЗначениеВСтрокуВнутр( )
Назначение:
Преобразование значения объекта агрегатного типа в строковое системное представление.
Возвращает: представление значения объекта в строковом системном виде.
Параметры:
- значение объекта агрегатного типа данных которое нужно преобразовать.
Похожие FAQ
Еще в этой же категории
Полнотекстовый поиск в 1С (что это и пример использования) 23
Полнотекстовый поиск - позволит найти текстовую информацию, размещенную практически в любом месте используемой конфигурации. При этом искать нужные данные можно либо по всей конфигурации в целом, либо сузив область поиска до нескольких объектов Формат, функция форматирования значений 21
//Функция формирует удобное для чтения представление значений. // Примеры форматирования чисел ЗначФормат = Формат(123456.789, " ЧЦ=10; ЧДЦ=2" ); // ЗначФормат = " 123 456,79" ЗначФормат = Формат(123456.789, " ЧГ=0; ЧДЦ=2" ); // Знач УстановитьСсылкуНового 11
Установить ссылку нового это специальный механизм программиста, который позволяет присваивать новому объекту нужную ссылку. В основном это задача обмена, во многих типовых обменах используется синхронизация по UID объекта. Рассмотрим этот метод на к Обработчики событий при записи объектов. Зачем и что за чем? 11
Программисту, имеющего немного опыта на платформе 1С 8.2, бывает сложно разобраться: ПередЗаписью, ПриЗаписи, ПослеЗаписи, на сервере, на клиенте, в модуле формы, в модуле объекта, а-а-а-а-аааа. Именно такое сложное чувство непонимания МоментВремени, получение остатков до и после проведения 9
" Момент времени" - виртуальное поле, не хранится в базе данных. Содержит объект МоментВремени (который включает в себя дату и ССЫЛКУ НА ДОКУМЕНТ) В 7.7 было понятие ПозицияДокумента, а в 8.x Момент времени Для получения Остатков, Движений: М Посмотреть все в категории Встроенные Функции
GUID / UUID должен состоять как минимум из 32 символов и оставаться в диапазоне ASCII, чтобы избежать проблем при их передаче.
GUID, представленные в виде строк, имеют длину не менее 36 и не более 38 символов и соответствуют шаблону ^ \ ? \> $ И, следовательно, всегда имеют формат ascii.?>
Странно, что никто еще не упомянул об этом, но для полноты картины на npm есть множество генераторов руководств, я готов поспорить, что большинство из них также работают в браузере.
Примерно 12 лет спустя с BigInt классами ES6 могут быть применены и другие методы, дающие скорость 500 000 uuid / sec. См. Ссылку
Для решения, совместимого с RFC4122 версии 4, это однострочное (ish) решение является наиболее компактным, что я мог придумать:
Обновление, 2015-06-02 : имейте в виду, что уникальность UUID во многом зависит от базового генератора случайных чисел (ГСЧ). Решение выше использует Math.random() для краткости, однако Math.random() это не гарантированно высокого качества ГСЧ. См. Прекрасную рецензию Адама Хайленда на Math.random () для подробностей. Для более надежного решения рассмотрите возможность использования модуля uuid , который использует более качественные API-интерфейсы RNG.
Обновление, 2020-01-06 : В разработке есть предложение по стандартному uuid модулю как части языка JavaScript.
Я знаю, что вы добавили много предостережений в свой пост, но вам лучше просто вычеркнуть первый ответ сейчас, многие новички просто придут к этому ответу и скопируют первое, что они увидят, не читая остальное. На самом деле вы не можете надежно сгенерировать UUID из Math.random API, и было бы опасно полагаться на это.
Если вы действительно хотите, чтобы управление версиями оставалось встроенным, а не за историей ревизий, вы должны изменить порядок: сначала держите самый последний ответ.
UUID (универсально уникальный идентификатор), также известный как GUID (глобально уникальный идентификатор), согласно RFC 4122 , представляют собой идентификаторы, предназначенные для обеспечения определенных гарантий уникальности.
Хотя можно реализовать совместимые с RFC UUID в нескольких строках кода JavaScript (например, см . Ответ @ broofa ниже), существует несколько распространенных ошибок:
- Недопустимый формат идентификатора (UUID должны иметь форму " xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx ", где x - одно из [0-9, af] M - одно из 5, а N - [8, 9, a или b]
- Использование некачественного источника случайности (например, Math.random )
Таким образом, разработчикам, пишущим код для производственных сред, рекомендуется использовать строгую, хорошо поддерживаемую реализацию, такую как модуль uuid .
Это не должен быть принятым ответом. На самом деле это не отвечает на вопрос - вместо этого поощряется импорт 25 000 строк кода для чего-то, что вы можете сделать с помощью одной строки кода в любом современном браузере.
@AbhiBeckert, ответ с 2008 года, и для проектов node.js может быть правильным выбрать зависимость больше, чем размер проекта
Я оспариваю утверждение, что Math.random - это настолько низкий уровень случайности. v8.dev/blog/math-random . Как видите, он прошел хороший набор тестов, и тот же алгоритм используется в v8, FF и Safari. И RFC утверждает, что псевдослучайные числа приемлемы для UUID.
Мне очень нравится, насколько чистый ответ Бруфа , но, к сожалению, плохие реализации Math.random оставляют вероятность столкновения.
Вот аналогичное решение, совместимое с RFC4122 версии 4, которое решает эту проблему путем смещения первых 13 шестнадцатеричных чисел на шестнадцатеричную часть временной метки и после истощения смещений на шестнадцатеричную часть микросекунд с момента загрузки страницы. Таким образом, даже если они Math.random находятся на одном и том же семени, оба клиента должны будут сгенерировать UUID точно такое же количество микросекунд с момента загрузки страницы (если поддерживается время высокой производительности) И в ту же самую миллисекунду (или более 10000 лет спустя), чтобы получить тот же UUID:
Модернизированный сниппет для ES6
Имейте в виду, new Date().getTime() не обновляется каждую миллисекунду. Я не уверен, как это влияет на ожидаемую случайность вашего алгоритма.
performance.now было бы еще лучше. В отличие от Date.now, возвращаемые метки времени performance.now() не ограничиваются разрешением в одну миллисекунду. Вместо этого они представляют время как числа с плавающей запятой с точностью до микросекунд . Также, в отличие от Date.now, значения, возвращаемые функцией performance.now (), всегда увеличиваются с постоянной скоростью , независимо от системных часов, которые могут быть скорректированы вручную или искажены программным обеспечением, таким как протокол сетевого времени.
Фактическое разрешение по времени может составлять или не составлять 17 мс (1/60 секунды), а не 1 мс.
Ответ broofa действительно хорош - впечатляюще умный, действительно . RFC4122-совместимый, отчасти читаемый и компактный. Потрясающие!
Но если вы смотрите на что регулярное выражение, те много replace() обратных вызовов, toString() «s и Math.random() вызовы функций (где он только с использованием четырех битов результата и растрачивая остальное), вы можете начать задумываться о производительности. Действительно, joelpt даже решил отказаться от RFC для общей скорости GUID с generateQuickGUID .
Но можем ли мы добиться скорости и соответствия RFC? Я сказал да! Можем ли мы сохранить читабельность? Ну . Не совсем, но это легко, если вы последуете за мной.
Но сначала мои результаты по сравнению с broofa guid (принятый ответ) и несовместимостью с RFC generateQuickGuid :
Таким образом, к моей 6-й итерации оптимизаций я превзошел самый популярный ответ более чем в 12 раз , принятый ответ - более чем в 9 раз , а быстрый несоответствующий ответ - в 2-3 раза . И я все еще совместим с RFC 4122.
Для объяснения давайте начнем с кода broofa:
Таким образом, он заменяет x любую случайную шестнадцатеричную цифру y случайными данными (за исключением принуждения двух верхних битов к 10 спецификации RFC), а регулярное выражение не соответствует символам - или 4 , поэтому ему не нужно иметь с ними дело. Очень-очень красиво.
Первое, что нужно знать, это то, что вызовы функций дороги, как и регулярные выражения (хотя он использует только 1, у него есть 32 обратных вызова, по одному на каждое совпадение, и в каждом из 32 обратных вызовов он вызывает Math.random () и v. toString (16)).
Первым шагом к повышению производительности является устранение RegEx и его функций обратного вызова и использование вместо этого простого цикла. Это означает , что мы должны иметь дело с - и 4 символов , тогда как broofa не сделал. Также обратите внимание, что мы можем использовать индексацию String Array, чтобы сохранить его элегантную архитектуру шаблона String:
По сути, та же внутренняя логика, за исключением того, что мы проверяем - или 4 , и использование цикла while (вместо replace() обратных вызовов) дает нам почти трехкратное улучшение!
Следующий шаг - небольшой для настольного компьютера, но он имеет большое значение для мобильных устройств. Давайте сделаем меньше вызовов Math.random () и будем использовать все эти случайные биты вместо того, чтобы отбрасывать 87% из них со случайным буфером, который смещается на каждой итерации. Давайте также переместим это определение шаблона из цикла, на всякий случай, если это поможет:
Это экономит 10-30% в зависимости от платформы. Неплохо. Но следующий большой шаг избавится от вызовов функции toString вместе с классической оптимизацией - таблицей поиска. Простая таблица поиска из 16 элементов выполнит задачу toString (16) за гораздо меньшее время:
Следующая оптимизация - еще одна классика. Поскольку мы обрабатываем только четыре бита вывода на каждой итерации цикла, давайте сократим количество циклов вдвое и обработаем восемь бит на каждой итерации. Это сложно, поскольку нам все еще нужно обрабатывать позиции битов, совместимых с RFC, но это не так уж сложно. Затем нам нужно создать более крупную таблицу поиска (16x16 или 256) для хранения 0x00 - 0xFF, и мы создаем ее только один раз, вне функции e5 ().
Я попробовал e6 (), который обрабатывает 16 бит за раз, все еще используя 256-элементный LUT , и он показал убывающую отдачу от оптимизации. Хотя у него было меньше итераций, внутренняя логика была усложнена увеличенной обработкой, и она работала так же на настольных компьютерах и только на ~ 10% быстрее на мобильных устройствах.
Последний прием оптимизации - развернуть цикл. Поскольку мы выполняем цикл фиксированное количество раз, технически мы можем записать все это вручную. Я попробовал это однажды с одной случайной величиной r , которую я все время переназначал, и производительность упала. Но с четырьмя переменными, которым заранее назначены случайные данные, затем с использованием таблицы поиска и применения правильных битов RFC, эта версия курит их все:
Самое смешное, что создание 16 байтов случайных данных - это самая простая часть. Вся уловка выражается в строковом формате с соблюдением RFC, и наиболее точно он достигается с помощью 16 байтов случайных данных, развернутого цикла и таблицы поиска.
Надеюсь, моя логика верна - очень легко ошибиться в такой утомительной работе. Но результаты мне нравятся. Надеюсь, вам понравилась эта безумная поездка по оптимизации кода!
Обратите внимание: моей основной целью было показать и научить потенциальным стратегиям оптимизации. Другие ответы охватывают важные темы, такие как столкновения и действительно случайные числа, которые важны для генерации хороших UUID.
Читайте также: