Лучший способ создания уникальной клиентской стороны идентификаторов (с Javascript)
Мне нужно создать уникальные идентификаторы в браузере. В настоящее время я использую это:
Math.floor(Math.random() * 10000000000000001)
Я хотел бы использовать текущее время UNIX ((new Date).getTime()
), но я беспокоюсь, что если два клиента будут генерировать идентификаторы в одно и то же время, они не будут уникальными.
Могу ли я использовать текущее время UNIX (я бы хотел, потому что в этом случае идентификаторы будут хранить больше информации)? Если нет, то какой лучший способ сделать это (возможно, UNIX-время + 2 случайных числа?)
Ответы
Ответ 1
вы можете создать GUID, используя следующие ссылки:
http://softwareas.com/guid0-a-javascript-guid-generator
Создать GUID/UUID в JavaScript?
Это максимизирует ваши шансы на "уникальность".
В качестве альтернативы, если это безопасная страница, вы можете связать дату/время с именем пользователя, чтобы предотвратить несколько одновременных сгенерированных значений.
Ответ 2
https://github.com/broofa/node-uuid предоставляет совместимые с RFC UUID на основе либо временной метки, либо случайных #. Единый файл без зависимостей, поддерживает временную метку или случайные UUID, основанные на #, использует собственные API для криптовариантных случайных чисел, если они доступны, плюс другие лакомства.
Ответ 3
В современном браузере вы можете использовать crypto:
var array = new Uint32Array(1);
window.crypto.getRandomValues(array);
console.log(array);
Ответ 4
var c = 1;
function cuniq() {
var d = new Date(),
m = d.getMilliseconds() + "",
u = ++d + m + (++c === 10000 ? (c = 1) : c);
return u;
}
Ответ 5
Вот мой код javascript для генерации guid. Он делает быстрое шестнадцатеричное отображение и очень эффективен:
AuthenticationContext.prototype._guid = function () {
// RFC4122: The version 4 UUID is meant for generating UUIDs from truly-random or
// pseudo-random numbers.
// The algorithm is as follows:
// Set the two most significant bits (bits 6 and 7) of the
// clock_seq_hi_and_reserved to zero and one, respectively.
// Set the four most significant bits (bits 12 through 15) of the
// time_hi_and_version field to the 4-bit version number from
// Section 4.1.3. Version4
// Set all the other bits to randomly (or pseudo-randomly) chosen
// values.
// UUID = time-low "-" time-mid "-"time-high-and-version "-"clock-seq-reserved and low(2hexOctet)"-" node
// time-low = 4hexOctet
// time-mid = 2hexOctet
// time-high-and-version = 2hexOctet
// clock-seq-and-reserved = hexOctet:
// clock-seq-low = hexOctet
// node = 6hexOctet
// Format: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
// y could be 1000, 1001, 1010, 1011 since most significant two bits needs to be 10
// y values are 8, 9, A, B
var guidHolder = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';
var hex = '0123456789abcdef';
var r = 0;
var guidResponse = "";
for (var i = 0; i < 36; i++) {
if (guidHolder[i] !== '-' && guidHolder[i] !== '4') {
// each x and y needs to be random
r = Math.random() * 16 | 0;
}
if (guidHolder[i] === 'x') {
guidResponse += hex[r];
} else if (guidHolder[i] === 'y') {
// clock-seq-and-reserved first hex is filtered and remaining hex values are random
r &= 0x3; // bit and with 0011 to set pos 2 to zero ?0??
r |= 0x8; // set pos 3 to 1 as 1???
guidResponse += hex[r];
} else {
guidResponse += guidHolder[i];
}
}
return guidResponse;
};
Ответ 6
Вы всегда можете запустить тест для существующих идентификаторов в наборе, чтобы принять или отклонить сгенерированное случайное число рекурсивно.
например:
const randomID = function(){
let id = Math.floor(Math.random() * 10000000000000001) + new Date();
if (idObjectArray.contains(id)) {
randomID;
} else {
idObjectArray.push(id);
}
};
В этом примере предполагается, что вы просто поместите идентификатор в одномерный массив, но вы поняли идею. Не должно быть много столкновений, учитывая уникальность случайного числа с датой, поэтому оно должно быть эффективным.