只是好奇下面的'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。但是,就我们的目的而言,“足够独特”可能满足我们的要求。我只想在数学上知道这种方法发生碰撞的可能性。
答案 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个唯一数字可供使用。如果你需要种下它,那就很简单了。