这涉及到这个问题.我正在使用此答案在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个月前相同(不同的用户).
所以问题是:
是什么导致了这个问题?
我怎么能避免呢?
小智.. 35
确实存在冲突,但仅限谷歌Chrome.在这里查看我对该主题的体验
http://devoluk.com/google-chrome-math-random-issue.html
似乎碰撞只发生在Math.random的前几次调用中.因为如果你只是运行上面的createGUID/testGUIDs方法(这显然是我尝试过的第一件事)它只是没有任何碰撞.
因此,要进行全面测试,需要重新启动Google Chrome,生成32字节,重启Chrome,生成,重启,生成...
确实存在冲突,但仅限谷歌Chrome.在这里查看我对该主题的体验
http://devoluk.com/google-chrome-math-random-issue.html
似乎碰撞只发生在Math.random的前几次调用中.因为如果你只是运行上面的createGUID/testGUIDs方法(这显然是我尝试过的第一件事)它只是没有任何碰撞.
因此,要进行全面测试,需要重新启动Google Chrome,生成32字节,重启Chrome,生成,重启,生成...
我最好的猜测是Math.random()
因为某种原因你的系统被破坏了(听起来很奇怪).这是我见过的第一个发生冲突的报告.
node-uuid
有一个测试工具,可用于测试该代码中十六进制数字的分布.如果看起来没问题,那就不行Math.random()
,那么尝试将你正在使用的UUID实现替换为uuid()
那里的方法,看看你是否仍然得到了好的结果.
[更新:刚刚看到Veselin关于Math.random()
启动时的错误的报告.由于问题仅在启动时,因此node-uuid
测试不太可能有用.我将在devoluk.com链接上详细评论.]
正如其他人可以意识到这一点 - 我使用这里提到的UUID生成技术遇到了大量明显的冲突.即使在我为随机数生成器切换到seedrandom之后,这些冲突仍在继续.就像你想象的那样,让我把头发撕掉了.
我最终发现问题是(几乎?)与Google的网络爬虫机器人完全相关.一旦我开始忽略用户代理字段中带有"googlebot"的请求,冲突就会消失.我猜他们必须以一种半智能的方式缓存JS脚本的结果,最终结果是他们的蜘蛛网浏览器无法按照普通浏览器的方式运行.
只是一个FYI.