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

Mux*_*uxa 90 javascript random uuid collision

这涉及到这个问题.我正在使用此答案在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);
});
Run Code Online (Sandbox Code Playgroud)

这个解决方案似乎工作正常,但我遇到了冲突.这就是我所拥有的:

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

所以问题是:

  1. 是什么导致了这个问题?
  2. 我怎么能避免呢?

小智 35

确实存在冲突,但仅限谷歌Chrome.在这里查看我对该主题的体验

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

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

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

  • 任何人都可以确认这个bug是否已被解决? (7认同)
  • 这非常令人担忧 - 有没有人提出错误报告? (2认同)
  • http://web.archive.org/web/20120503063359/http://baagoe.com/en/RandomMusings/javascript/ (2认同)

bro*_*ofa 33

我最好的猜测是Math.random()因为某种原因你的系统被破坏了(听起来很奇怪).这是我见过的第一个发生冲突的报告.

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

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

  • 到目前为止没有碰撞:) (10认同)

Ken*_*ith 18

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

我最终发现问题是(几乎?)与Google的网络爬虫机器人完全相关.一旦我开始忽略用户代理字段中带有"googlebot"的请求,冲突就会消失.我猜他们必须以一种半智能的方式缓存JS脚本的结果,最终结果是他们的蜘蛛网浏览器无法按照普通浏览器的方式运行.

只是一个FYI.

  • 我们的指标系统遇到了同样的问题。使用“ node-uuid”模块在浏览器中生成会话ID时,看到数千次UUID冲突。原来一直是googlebot。谢谢! (2认同)