Лучший способ генерировать уникальные идентификаторы на стороне клиента (с помощью Javascript) - PullRequest
15 голосов
/ 24 августа 2009

Мне нужно создать уникальные идентификаторы в браузере. В настоящее время я использую это:

Math.floor(Math.random() * 10000000000000001)

Я бы хотел использовать текущее время UNIX ((new Date).getTime()), но я боюсь, что если два клиента сгенерируют идентификаторы в точно , они не будут уникальными. 1007 *

Могу ли я использовать текущее время UNIX (хотелось бы, потому что таким образом идентификаторы будут хранить больше информации)? Если нет, каков наилучший способ сделать это (может быть, время UNIX + 2 случайные цифры?)

Ответы [ 6 ]

16 голосов
/ 24 августа 2009

вы можете создать GUID, используя следующие ссылки:

http://softwareas.com/guid0-a-javascript-guid-generator

Создать GUID / UUID в JavaScript?

Это увеличит ваши шансы на «уникальность».

Либо, если это защищенная страница, вы можете объединить дату / время с именем пользователя, чтобы предотвратить одновременное создание нескольких значений.

9 голосов
/ 04 января 2012

https://github.com/broofa/node-uuid предоставляет RFC-совместимые UUID на основе либо временной метки, либо случайных #. Один файл без зависимостей, поддерживает временные метки или случайные UUID на основе #, использует собственные API-интерфейсы для случайных чисел криптографического качества, если они доступны, плюс другие полезности.

4 голосов
/ 04 октября 2017

В современном браузере вы можете использовать crypto :

var array = new Uint32Array(1);
window.crypto.getRandomValues(array);
console.log(array);
1 голос
/ 07 октября 2014

Вот мой код 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;
};
1 голос
/ 07 октября 2013
var c = 1;
function cuniq() {
    var d = new Date(),
        m = d.getMilliseconds() + "",
        u = ++d + m + (++c === 10000 ? (c = 1) : c);

    return u;
}
0 голосов
/ 05 февраля 2019

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

например:

const randomID = function(){
    let id = Math.floor(Math.random() * 10000000000000001) + new Date();

    if (idObjectArray.contains(id)) {
    randomID;
} else {
    idObjectArray.push(id);
}
};

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...