在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);
});
这个解决方案似乎工作正常,但是我碰到了碰撞。 这是我的:
所以问题是:
我最好的猜测是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()?