javascript生成的UUID的唯一性和随机性如何?
我正在考虑使用讨论的uuid方法之一为javascript中的数据生成唯一标识符。最有可能是类似的东西,因为它使用window.crypto(如果可用) 这些id不需要全局唯一,只需每个用户唯一。这会为大规模应用程序生成足够唯一的ID吗?有没有理由认为这会导致id冲突?javascript能否生成足够随机的uuid以使其正常工作?看起来window.crypto应用相当广泛,这个项目已经需要相当现代的浏览器 更多信息:有关该问题的一些背景信息可从以下评论中找到: 。。。(续)此函数生成的两个ID发生冲突的几率 从字面上说,它们是天文上的小。除6位以外的所有128位 ID是随机生成的,这意味着对于任意两个ID,都有一个 1/2^^122(或5.3x10^^36)发生碰撞的概率布罗法 这是5316911983139663491615222824121378304(5.3未确定)碰撞概率中的1 还要确保当用户尝试使用此uuid创建新记录时,验证该uuid是否尚未使用。这属于从不相信用户输入的更大策略 如果您不确信,也可以测试此生成器:javascript生成的UUID的唯一性和随机性如何?,javascript,guid,uuid,Javascript,Guid,Uuid,我正在考虑使用讨论的uuid方法之一为javascript中的数据生成唯一标识符。最有可能是类似的东西,因为它使用window.crypto(如果可用) 这些id不需要全局唯一,只需每个用户唯一。这会为大规模应用程序生成足够唯一的ID吗?有没有理由认为这会导致id冲突?javascript能否生成足够随机的uuid以使其正常工作?看起来window.crypto应用相当广泛,这个项目已经需要相当现代的浏览器 更多信息:有关该问题的一些背景信息可从以下评论中找到: 。。。(续)此函数生成的两个ID
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)中运行它,在170000个ID之后仍然没有冲突编辑:240000。我看到了这一点,但后来的一些评论也说“只要Math.random只产生伪随机数,你的概率计算似乎是错误的”有替代RNG…'如果你想要一个“更随机”的种子,你可以做一些类似于用
onmousemove
事件检测鼠标移动的事情。然而,如果用户通过打开控制台并更改变量来提交自己的UUID,那么您使用的任何技术都是无用的。最终,您仍然需要验证服务器端;因为无论如何检查冲突是不可避免的,所以您应该对UUID解决方案感到满意,该解决方案基本上(如果不是完全)没有冲突。