在JavaScript中生成UUID时发生冲突?

这涉及到这个问题。 我正在使用这个答案在JavaScript中生成UUID:

'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);
});

这个解决方案似乎工作正常,但是我碰到了碰撞。 这是我的:

  • 在Google Chrome中运行的网络应用程序。
  • 16位用户。
  • 这些用户在过去2个月内已生成约4000个UUID。
  • 我得到了大约20次碰撞 - 例如,今天生成的新UUID与大约2个月前(不同用户)相同。
  • 所以问题是:

  • 是什么导致了这个问题?
  • 我如何避免它?

  • 我最好的猜测是Math.random()出于某种原因在你的系统上被破坏了(奇怪的是)。 这是我见过的任何碰撞事故的第一份报告。

    node-uuid有一个测试工具,可以用来测试该代码中十六进制数字的分布。 如果这看起来没问题,那么它不是Math.random() ,那么请尝试用你使用的UUID实现代替到那里的uuid()方法,看看你是否仍然得到好的结果。

    [更新:刚刚在启动时看到了Veselin关于Math.random()的错误报告。 由于问题只在启动时进行,因此node-uuid测试不太可能有用。 我会更详细地评论devoluk.com链接。]


    确实存在冲突,但仅限于Google Chrome浏览器。 查看我在这里的主题的经验

    http://devoluk.com/google-chrome-math-random-issue.html

    似乎碰撞只发生在Math.random的前几个调用中。 因为如果你只是运行上面的createGUID / testGUIDs方法(这显然是我尝试的第一件事),它只是在没有任何冲突的情况下工作。

    因此,要进行全面测试,需要重新启动Google Chrome,生成32个字节,重新启动Chrome,生成,重新启动,生成...


    为了让其他人能够意识到这一点 - 我使用这里提到的UUID生成技术,遇到了大量明显的碰撞。 即使在我切换到随机数生成器的seedrandom后,这些冲突仍然继续。 就像你想象的那样,这让我把头发撕掉了。

    我最终发现问题几乎与Google的网络爬虫机器人完全相关。 只要我开始忽略用户代理字段中的“googlebot”请求,冲突就消失了。 我猜测他们必须以一种半智能的方式缓存JS脚本的结果,最终结果是他们的蜘蛛浏览器无法像普通浏览器那样工作。

    仅供参考。

    链接地址: http://www.djcxy.com/p/2659.html

    上一篇: Collisions when generating UUIDs in JavaScript?

    下一篇: Proper use cases for Android ActivityManager.isUserAMonkey()?