Javascript—ID冲突的几率

Javascript—ID冲突的几率,javascript,uniqueidentifier,Javascript,Uniqueidentifier,只是想知道下面的“uniqueID”变量的ID冲突几率是多少: var uniqueID = new Date().getTime() + '-xxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); });

只是想知道下面的“uniqueID”变量的ID冲突几率是多少:

    var uniqueID = new Date().getTime() + '-xxxxxxxxx'.replace(/[xy]/g, function (c) {
        var r = Math.random() * 16 | 0,
            v = c == 'x' ? r : (r & 0x3 | 0x8);
        return v.toString(16);
    });

我意识到我可以使用GUID来创建“全局唯一”ID。但是,出于我们的目的,“足够唯一”可能满足我们的要求。我只是想从数学上知道这种方法发生碰撞的可能性

时间戳以毫秒为单位,因此如果在同一毫秒内生成两个,它们碰撞的几率很低,但不是零

现在,通常假定Math.random()是一致的,碰撞的几率就是两个Math.random()调用碰撞的几率,乘以您正在执行的Math.random()调用的次数。。。。但你添加了一些“聪明”的东西,实际上会对赔率产生灾难性的影响:

r = Math.random() * 16; // good: a random float between 0 and 16
r = Math.random() * 16 | 0; // bad: a random int between 0 and 16
|0
将极其丰富的浮点随机数转换为32位整数,从而丢失所有可防止冲突的可爱位

我不知道为什么,但你已经添加了它,它使碰撞的几率更高:在每一步中,碰撞的几率现在相当可能是1/16,因此总几率是(1/16)到“字符串中的
x
e的数量”的幂次方

基本上他们是不必要的高,我会拒绝这个发电机。这很奇怪,特别是因为你可以使用一些简单的Math.random(),或者如果你想要真正的唯一性,可以使用一个实际的唯一性标准和一个顺序id生成器,比如

var nextid = (function(id) {
  id = id || 0;
  return function() { return id++; };
}(firstIdToUse)); // <- optional seed value
var nextid=(函数(id){
id=id | | 0;
返回函数(){return id++;};

}(第一次使用));//您正在添加时间戳-
新日期().getTime()
。我认为不会发生ID冲突。如果在
xxxxxxxx
中有一些
y
,以毫秒为单位的时间戳将是唯一的,因此不会发生冲突;不可能collision@mohamedrias可能会发生碰撞,关键是时间戳(毫秒)。如果在同一毫秒内生成两个,它们碰撞的几率极低,但不是零。Math.random()被认为是统一的,所以它只是Math.random()碰撞的几率,乘以Math.random()调用的次数。几率不是每个ID的
1/16
,而是ID中每个十六进制数字的
1/16
,表示为
x
;其中有九个,总共为
4*9
位,给出的几率为
1/68719476736
。原因很明显:随机数是一个数字,所以它必须是整数。这比不上
1/2^56
,但可以通过添加更多数字来轻松调整。此外,OP可能有理由不使用计数器ID,例如多个独立代理同时创建ID。@Amadan谢谢,这实际上回答了我的问题。如果你把它作为答案贴出来,我会接受的。@Amadan:是的,我是这么说的<代码>总赔率是(1/16)到“字符串中X的数量”的幂次方。
。VinnyD询问了碰撞的可能性,这个答案描述了这一点;剩下的是基于“为什么满足于“足够独特”的评论,而“真正独特”更好,代码更少?”答案本身很好。我的反应是‘但你添加了一些“聪明”的东西,实际上对赔率有灾难性的影响’,‘以及‘失去了所有可以防止碰撞的可爱部分’。他每次随机调用都会减少到4位,但是通过串几个数字来弥补——所以我很困惑为什么你认为
Math.random()*16
是好的,但是一些
Math.random()*16 | 0
是坏的。对于后者,如果有足够的
x
s,则熵会更强。我已经演示了为什么“更好”是相对的,并且可以随着设计要求而改变。从计算角度来看,两个连续的
Math.random()*16
调用的冲突远小于两个连续的
Math.random()*16
。如果你的目标是避免冲突,那么抛出一个64位浮点,其中几乎所有的位都与一个32位整数相关,在这个32位整数中只有四位是重要的,这是一件很奇怪的事情,任何询问“冲突几率有多大”但展示了这段代码的人可能都不知道他们在做什么。如果他们故意用4个有意义的位强制一个32位int,那么他们已经理解了所涉及的概率。