Как создать GUID / UUID?
Заголовок: Как создать GUID (глобально уникальные идентификаторы) в JavaScript?
Описание проблемы: Я пытаюсь создать GUID (UUID), который должен быть не менее 32 символов и оставаться в диапазоне ASCII, чтобы избежать проблем при передаче его между различными частями приложения.
Мне непонятно, какие методы доступны во всех браузерах, насколько "случайным" и начальным является встроенный генератор случайных чисел, и как это может повлиять на генерацию уникальных идентификаторов.
Подскажите, пожалуйста, как правильно создать GUID в JavaScript, чтобы гарантировать его уникальность и соответствие указанным требованиям.
4 ответ(ов)
Вот совершенно несовместимая, но очень быстрая реализация для генерации уникального идентификатора, похожего на 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, эта реализация может оказаться весьма полезной!
Этот код создает 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()
, она возвращает новый уникальный идентификатор.
Этот код определяет функцию uuid
, которая генерирует UUID версии 4 (случайный).
Вот как он работает:
- Сначала создается массив
buf
типаUint32Array
длиной 4, который позже будет заполнен случайными значениями. - Метод
window.crypto.getRandomValues(buf)
используется для генерации безопасных случайных значений и заполнения массиваbuf
. - Затем переменная
idx
инициализируется значением -1, что будет использовано для отслеживания текущего индекса при замене символов в строке шаблона UUID. - Строка
'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
представляет собой шаблон UUID, где символыx
иy
будут заменены на случайные значения. Функцияreplace
перебирает каждый символ шаблона. - Внутри функции замены происходит следующее:
idx
увеличивается на 1, чтобы указать на текущий символ.- С помощью битовых операций извлекается 4-битное значение (nibble) из
buf
, используя индексidx
. - Если символ
c
равенx
, то используется случайное значениеr
. Если символc
равенy
, то происходит дополнительная операция, которая гарантирует, что значение будет находиться в диапазоне от 8 до 11 (то есть соответствует версии 4 UUID).
- Наконец, результат возвращается в виде строки UUID в шестнадцатеричном формате.
Данный код соответствует схеме UUID версии 4, потому что он генерирует случайные значения и учитывает необходимые ограничения формата. Это особенно полезно, если у вас были проблемы с анализом некорректных UUID в Java, как упоминается в вашем вопросе.
Вот пример простого 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"
Этот модуль прост в использовании и подходит для большинства сценариев, где требуются уникальные идентификаторы.
Как создать GUID/UUID в Python
В чем разница между String.slice и String.substring?
Проверка соответствия строки регулярному выражению в JS
Существует ли ссылка на "последнюю" библиотеку jQuery в Google APIs?
Как создать диалог с кнопками "Ок" и "Отмена"