Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript生成的UUID的唯一性和随机性如何?_Javascript_Guid_Uuid - Fatal编程技术网

javascript生成的UUID的唯一性和随机性如何?

javascript生成的UUID的唯一性和随机性如何?,javascript,guid,uuid,Javascript,Guid,Uuid,我正在考虑使用讨论的uuid方法之一为javascript中的数据生成唯一标识符。最有可能是类似的东西,因为它使用window.crypto(如果可用) 这些id不需要全局唯一,只需每个用户唯一。这会为大规模应用程序生成足够唯一的ID吗?有没有理由认为这会导致id冲突?javascript能否生成足够随机的uuid以使其正常工作?看起来window.crypto应用相当广泛,这个项目已经需要相当现代的浏览器 更多信息:有关该问题的一些背景信息可从以下评论中找到: 。。。(续)此函数生成的两个ID

我正在考虑使用讨论的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是否尚未使用。这属于从不相信用户输入的更大策略

如果您不确信,也可以测试此生成器:

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解决方案感到满意,该解决方案基本上(如果不是完全)没有冲突。