生成唯一ID的最佳方法客户端(使用Javascript)

时间:2009-08-24 05:07:00

标签: javascript jquery

我需要在浏览器中生成唯一的ID。目前,我正在使用它:

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

我想使用当前的UNIX时间((new Date).getTime()),但我担心如果两个客户端同时在完全生成id,它们将不会唯一的。

我可以使用当前的UNIX时间(我想这样,因为这种方式会存储更多信息)?如果没有,最好的方法是什么(可能是UNIX时间+ 2个随机数字?)

7 个答案:

答案 0 :(得分:16)

您可以使用以下链接创建GUID:

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

Create GUID / UUID in JavaScript?

这将最大化你“独特性”的机会。

或者,如果它是一个安全页面,您可以将日期/时间与用户名连接起来,以防止同时生成多个值。

答案 1 :(得分:9)

https://github.com/broofa/node-uuid根据时间戳或随机#提供符合RFC的UUID。单个文件没有依赖关系,支持时间戳或随机的基于#UU的UUID,如果可用,则使用本机API获取加密质量的随机数,以及其他好东西。

答案 2 :(得分:4)

在现代浏览器中,您可以使用crypto

var array = new Uint32Array(1);
window.crypto.getRandomValues(array);
console.log(array);

答案 3 :(得分:1)

var c = 1;
function cuniq() {
    var d = new Date(),
        m = d.getMilliseconds() + "",
        u = ++d + m + (++c === 10000 ? (c = 1) : c);

    return u;
}

答案 4 :(得分:1)

这是我生成guid的javascript代码。它可以快速进行十六进制映射并且非常高效:

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;
};

答案 5 :(得分:1)

有两种方法可以实现这一目标

  1. js const id = Date.now().toString()

虽然这不能保证唯一性(当您在1ms内创建多个对象时),但是这将在实际的水平上起作用,因为通常不需要很长时间才能将客户端上的对象发送到真实服务器。

  1. 如果您想在1ms内创建多个记录,建议使用下面的代码
const { randomBytes } = require("crypto");

// 32 Characters
const id = randomBytes(16).toString("hex");

它的工作方式类似于uuid4,而无需添加外部库(假设您有时可以访问NodeJ)

答案 6 :(得分:0)

您始终可以针对集合中的现有ID进行测试,以递归地接受或拒绝生成的随机数。

例如:

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

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

此示例假定您只是将id推入一维数组,但您明白了。鉴于随机数与日期的唯一性,应该不会发生太多冲突,因此应该有效率。