在JavaScript中创建全局唯一标识符

41

我有一个脚本,在用户加载时创建一个唯一的ID,然后将其保存在localStorage中并用于跟踪交易。有点像使用cookie,但由于浏览器生成唯一的ID,因此发送到服务器时可能会发生冲突。现在我正在使用以下代码:

function genID() {
    return Math.random().toString(36).substr(2)
        + Math.random().toString(36).substr(2)
        + Math.random().toString(36).substr(2)
        + Math.random().toString(36).substr(2);
}

我意识到这是一个非常基本的实现,想要一些关于创建一个更随机的id来防止服务器碰撞的更好方式的反馈。有什么建议吗?


JavaScript有GUID吗? - Sam I am says Reinstate Monica
@SamIam,phpjs、underscore,以及许多其他库都有一个uniqueId函数,但JS本身并没有提供这个功能。 - SgtPooki
@TrevNorris 你是否真的遇到了这个冲突?你有多少条目?我创建了一个简单的测试来确定需要多少个Math.random().toString(34).substr(2)才能创建一个重复项,并且使用Web Workers,我的脚本运行了几个小时而没有发生冲突。(toString(36)更短,仍然有7.30787211e+9个不同的排列组合) - SgtPooki
2
@SgtPooki 我从来没有遇到过冲突。只是想知道在JS中有没有正确的uid方法。 - Trevor Norris
@TrevNorris 谢谢确认,我想确保我不需要回去修改什么... =P - SgtPooki
1个回答

19

我以前用过这个。碰撞的可能性应该非常低。

var generateUid = function (separator) {
    /// <summary>
    ///    Creates a unique id for identification purposes.
    /// </summary>
    /// <param name="separator" type="String" optional="true">
    /// The optional separator for grouping the generated segmants: default "-".    
    /// </param>

    var delim = separator || "-";

    function S4() {
        return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
    }

    return (S4() + S4() + delim + S4() + delim + S4() + delim + S4() + delim + S4() + S4() + S4());
};

2
我喜欢你限制随机值长度的方式。 - Trevor Norris
1
@James South,我没有完全理解,请你能否解释一下? - Venkatesh Laguduva
1
'0x10000' 是什么作用? - Jack
这是65536,即16位最大数。https://zh.wikipedia.org/wiki/65536 - James South
小建议:我发现其他示例使用调用getTime()来限制冲突的风险...var generateUid = function (separator) { var delim = separator || "-"; function S4() { return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); } var st = ((new Date).getTime().toString(16)).slice(0,11) + (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1,2);return (S4() + S4() + delim + S4() + delim + S4() + delim + S4() + delim + st);}; - Didier68
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接