来自this answer的cmets:
... (cont'd) 此函数生成的两个 ID 发生冲突的几率
从字面上看,是天文数字的小。除了 128 位中的 6 位之外的所有
ID 是随机生成的,这意味着对于任何两个 id,都有一个
2^^122(或 5.3x10^^36)中的 1 概率会发生碰撞。 – 布鲁法
这是 5,316,911,983,139,663,491,615,228,241,121,378,304 (5.3 undecillion) 的 1 分之一的碰撞几率。
还要确保验证当用户尝试使用此 uuid 创建新记录时,该 uuid 尚未在使用中。这属于从不信任用户输入的更大策略。
如果您不相信,您也可以测试此生成器:
function getUUID() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
return v.toString(16);
});
}
var uuids = [];
var last;
var numGenerated = 0;
do {
last = getUUID();
if (uuids.indexOf(last) === -1) {
uuids.push(last);
numGenerated++;
console.log(numGenerated);
} else {
break;
}
} while (true);
console.log('Got collision after ' + numGenerated + ' generated UUIDS.');
我现在在 Node.js (V8) 中运行它,并且在 170,000 个 id 之后仍然没有冲突。 编辑: 240,000。