我正在考虑使用所讨论的uuid方法here之一为javascript中的数据生成唯一标识符。最有可能是this one的内容,因为如果它可用,它会使用window.crypto。
这些ID不需要全球唯一,每个用户只能是唯一的。这会为大规模应用生成足够独特的ID吗?有没有理由认为这会导致id碰撞? javascript可以为此生成足够随机的uuid吗?看起来window.crypto相当广泛,这个特殊的项目已经需要相当现代的浏览器。
更多信息:可以找到有关此问题的一些背景信息here
答案 0 :(得分:1)
来自this answer的评论:
...(续' d)此函数生成的两个ID冲突的几率 从字面上看,天文学上很小。除了128位之外的所有6位 ID是随机生成的,这意味着对于任何两个ID,都有一个 1比2 ^^ 122(或5.3x10 ^^ 36)他们碰撞的机会。 - broofa
这是5,316,911,983,139,663,491,615,228,241,121,378,304(5.3十亿分之一)碰撞的概率。
还要确保在用户尝试使用此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。