【问题标题】:How unique and random are javascript generated uuids?javascript 生成的 uuid 的唯一性和随机性如何?
【发布时间】:2014-04-19 00:46:28
【问题描述】:

我正在考虑使用here 讨论的其中一种 uuid 方法为 javascript 中的数据生成唯一标识符。很可能类似于this one,因为它使用window.crypto(如果可用)。

这些 id 不需要是全局唯一的,只需每个用户唯一。这会为大规模应用程序生成足够独特的 id 吗?有没有理由认为这会导致 id 冲突? javascript 可以生成一个足够随机的 uuid 以使其正常工作吗?看起来 window.crypto 的使用范围相当广泛,而且这个特定项目已经需要相当现代的浏览器。

更多信息:有关该问题的一些背景信息可以在here

【问题讨论】:

    标签: javascript guid uuid


    【解决方案1】:

    来自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。

    【讨论】:

    • 我看到了,但几厘米后它还说“只要 Math.random 只产生伪随机数,你的赔率计算似乎是错误的”
    • 有替换的RNG...'
    • 如果你想要一个“更随机”的种子,你可以使用onmousemove 事件来检测鼠标移动。但是,如果用户通过调出控制台并更改变量来提交自己的 UUID,那么您使用的任何技术都将毫无用处。最终,您仍然必须验证服务器端;因为无论如何检查碰撞都是不可避免的,所以您应该对大部分(如果不是完全)无碰撞的 UUID 解决方案感到满意。
    猜你喜欢
    • 2011-11-17
    • 1970-01-01
    • 2013-03-13
    • 2018-05-03
    • 2011-04-29
    • 1970-01-01
    • 2013-01-10
    • 2012-08-05
    • 1970-01-01
    相关资源
    最近更新 更多