Javascript - ID碰撞的几率

时间:2015-04-09 04:51:26

标签: 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);
    });

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

1 个答案:

答案 0 :(得分:0)

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

现在,通常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 es的数量"。

基本上他们不必要地高,我拒绝这个发电机。这很奇怪,特别是因为你可以使用几个直接的Math.random(),或者你想要真正的唯一性,使用实际的唯一性标准与一个顺序id生成器配对,如< / p>

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

在那里,现在你的唯一性仅限于JavaScript中的Number类型。这大约有2 ^ 53个唯一数字可供使用。如果你需要种下它,那就很简单了。