Javascript-ID冲突的几率

Javascript - Odds of ID Collision

本文关键字:几率 冲突 Javascript-ID      更新时间:2023-09-26

只是好奇下面的"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.randum()调用碰撞的几率,乘以您正在执行的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)乘以"字符串中xes的数量"。

基本上他们是不必要的高,我会拒绝这个发电机。这很奇怪,尤其是因为你可以使用一些直接的Math.random(),或者如果你想要真正的唯一性,可以使用实际的唯一性标准,并与等序列id生成器配对

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

现在,您的唯一性完全受到JavaScript中Number类型的限制。这大约是2^53个唯一的数字。如果你需要播种的话,这是很琐碎的。