54

Как создать GUID / UUID?

23

Заголовок: Как создать GUID (глобально уникальные идентификаторы) в JavaScript?

Описание проблемы: Я пытаюсь создать GUID (UUID), который должен быть не менее 32 символов и оставаться в диапазоне ASCII, чтобы избежать проблем при передаче его между различными частями приложения.

Мне непонятно, какие методы доступны во всех браузерах, насколько "случайным" и начальным является встроенный генератор случайных чисел, и как это может повлиять на генерацию уникальных идентификаторов.

Подскажите, пожалуйста, как правильно создать GUID в JavaScript, чтобы гарантировать его уникальность и соответствие указанным требованиям.

4 ответ(ов)

0

Вот совершенно несовместимая, но очень быстрая реализация для генерации уникального идентификатора, похожего на GUID, но безопасного для ASCII:

function generateQuickGuid() {
    return Math.random().toString(36).substring(2, 15) +
           Math.random().toString(36).substring(2, 15);
}

Эта функция генерирует 26 символов [a-z0-9], что дает UID, который короче и более уникален, чем соответствующие GUID по стандарту RFC. Если важна читаемость для человека, дефисы можно добавить без особых усилий.

Вот примеры использования и время выполнения этой функции и нескольких других ответов на этот вопрос. Измерения проводились в Chrome версии m25, по 10 миллионов итераций для каждой функции.

>>> generateQuickGuid()
"nvcjf1hs7tf8yyk4lmlijqkuo9"
"yq6gipxqta4kui8z05tgh9qeel"
"36dh5sec7zdj90sk2rx7pjswi2"
время выполнения: 32.5с

>>> GUID() // John Millikin
"7a342ca2-e79f-528e-6302-8f901b0b6888"
время выполнения: 57.8с

>>> regexGuid() // broofa
"396e0c46-09e4-4b19-97db-bd423774a4b3"
время выполнения: 91.2с

>>> createUUID() // Kevin Hakanson
"403aa1ab-9f70-44ec-bc08-5d5ac56bd8a5"
время выполнения: 65.9с

>>> UUIDv4() // Jed Schmidt
"f4d7d31f-fa83-431a-b30c-3e6cc37cc6ee"
время выполнения: 282.4с

>>> Math.uuid() // broofa
"5BD52F55-E68F-40FC-93C2-90EE069CE545"
время выполнения: 225.8с

>>> Math.uuidFast() // broofa
"6CB97A68-23A2-473E-B75B-11263781BBE6"
время выполнения: 92.0с

>>> Math.uuidCompact() // broofa
"3d7b7a06-0a67-4b67-825c-e5c43ff8c1e8"
время выполнения: 229.0с

>>> bitwiseGUID() // jablko
"baeaa2f-7587-4ff1-af23-eeab3e92"
время выполнения: 79.6с

>>>> betterWayGUID() // Andrea Turri
"383585b0-9753-498d-99c3-416582e9662c"
время выполнения: 60.0с

>>>> UUID() // John Fowler
"855f997b-4369-4cdb-b7c9-7142ceaf39e8"
время выполнения: 62.2с

Вот код для замера времени выполнения.

var r;
console.time('t'); 
for (var i = 0; i < 10000000; i++) { 
    r = FuncToTest(); 
};
console.timeEnd('t');

Если вам нужно быстро генерировать уникальные идентификаторы и не требуется полное соответствие стандарту RFC, эта реализация может оказаться весьма полезной!

0

Этот код создает UUID версии 4 (сгенерированный на основе псевдослучайных чисел):

function uuid()
{
   var chars = '0123456789abcdef'.split('');

   var uuid = [], rnd = Math.random, r;
   uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
   uuid[14] = '4'; // версия 4

   for (var i = 0; i < 36; i++)
   {
      if (!uuid[i])
      {
         r = 0 | rnd()*16;

         uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r & 0xf];
      }
   }

   return uuid.join('');
}

Вот несколько примеров сгенерированных UUID:

682db637-0f31-4847-9cdf-25ba9613a75c
97d19478-3ab2-4aa1-b8cc-a1c3540f54aa
2eed04c9-2692-456d-a0fd-51012f947136

Этот код создает уникальные идентификаторы, которые полезны для различных приложений, требующих уникальности, например, в базах данных или для создания токенов. Каждый раз, когда вы вызываете функцию uuid(), она возвращает новый уникальный идентификатор.

0

Этот код определяет функцию uuid, которая генерирует UUID версии 4 (случайный).

Вот как он работает:

  1. Сначала создается массив buf типа Uint32Array длиной 4, который позже будет заполнен случайными значениями.
  2. Метод window.crypto.getRandomValues(buf) используется для генерации безопасных случайных значений и заполнения массива buf.
  3. Затем переменная idx инициализируется значением -1, что будет использовано для отслеживания текущего индекса при замене символов в строке шаблона UUID.
  4. Строка 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx' представляет собой шаблон UUID, где символы x и y будут заменены на случайные значения. Функция replace перебирает каждый символ шаблона.
  5. Внутри функции замены происходит следующее:
    • idx увеличивается на 1, чтобы указать на текущий символ.
    • С помощью битовых операций извлекается 4-битное значение (nibble) из buf, используя индекс idx.
    • Если символ c равен x, то используется случайное значение r. Если символ c равен y, то происходит дополнительная операция, которая гарантирует, что значение будет находиться в диапазоне от 8 до 11 (то есть соответствует версии 4 UUID).
  6. Наконец, результат возвращается в виде строки UUID в шестнадцатеричном формате.

Данный код соответствует схеме UUID версии 4, потому что он генерирует случайные значения и учитывает необходимые ограничения формата. Это особенно полезно, если у вас были проблемы с анализом некорректных UUID в Java, как упоминается в вашем вопросе.

0

Вот пример простого JavaScript модуля для генерации GUID (глобально уникальных идентификаторов), который комбинирует лучшие ответы на соответствующий вопрос. Этот код включает в себя обработку для IE11 и использует криптографию для создания более надежных идентификаторов, если поддержка доступна.

var crypto = window.crypto || window.msCrypto || null; // Фикс для IE11

var Guid = Guid || (function() {

  var EMPTY = '00000000-0000-0000-0000-000000000000';

  // Дополнительная функция для дополнения строки слева
  var _padLeft = function(paddingString, width, replacementChar) {
    return paddingString.length >= width ? paddingString : _padLeft(replacementChar + paddingString, width, replacementChar || ' ');
  };

  // Функция для генерации 4-значного шестнадцатеричного числа
  var _s4 = function(number) {
    var hexadecimalResult = number.toString(16);
    return _padLeft(hexadecimalResult, 4, '0');
  };

  // Функция для генерации GUID с использованием криптографических случайных чисел
  var _cryptoGuid = function() {
    var buffer = new window.Uint16Array(8);
    crypto.getRandomValues(buffer);
    return [_s4(buffer[0]) + _s4(buffer[1]), _s4(buffer[2]), _s4(buffer[3]), _s4(buffer[4]), _s4(buffer[5]) + _s4(buffer[6]) + _s4(buffer[7])].join('-');
  };

  // Функция для генерации GUID без криптографических значений
  var _guid = function() {
    var currentDateMilliseconds = new Date().getTime();
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(currentChar) {
      var randomChar = (currentDateMilliseconds + Math.random() * 16) % 16 | 0;
      currentDateMilliseconds = Math.floor(currentDateMilliseconds / 16);
      return (currentChar === 'x' ? randomChar : (randomChar & 0x7 | 0x8)).toString(16);
    });
  };

  // Создание GUID с проверкой поддержки криптографии
  var create = function() {
    var hasCrypto = crypto != 'undefined' && crypto !== null,
      hasRandomValues = typeof(window.crypto.getRandomValues) != 'undefined';
    return (hasCrypto && hasRandomValues) ? _cryptoGuid() : _guid();
  };

  return {
    newGuid: create, // метод для создания нового GUID
    empty: EMPTY // пустой GUID
  };
})();

// Пример использования: Создание и отображение GUID
console.log('1. Новый Guid:   ' + Guid.newGuid());

// Пример отображения пустого GUID
console.log('2. Пустой Guid: ' + Guid.empty);

Использование:

  • Для создания нового GUID используйте метод Guid.newGuid():

    Guid.newGuid(); // Пример результата: "c6c2d12f-d76b-5739-e551-07e6de5b0807"
    
  • Для получения пустого GUID используйте Guid.empty:

    Guid.empty; // Результат: "00000000-0000-0000-0000-000000000000"
    

Этот модуль прост в использовании и подходит для большинства сценариев, где требуются уникальные идентификаторы.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь