javascript生成的uuids有多独特和随机?

时间:2014-04-19 00:46:29

标签: javascript guid uuid

我正在考虑使用所讨论的uuid方法here之一为javascript中的数据生成唯一标识符。最有可能是this one的内容,因为如果它可用,它会使用window.crypto。

这些ID不需要全球唯一,每个用户只能是唯一的。这会为大规模应用生成足够独特的ID吗?有没有理由认为这会导致id碰撞? javascript可以为此生成足够随机的uuid吗?看起来window.crypto相当广泛,这个特殊的项目已经需要相当现代的浏览器。

更多信息:可以找到有关此问题的一些背景信息here

1 个答案:

答案 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。