当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在JavaScript中生成UUID时发生冲突?》经验,为你挑选了3个好方法。

这涉及到这个问题.我正在使用此答案在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,生成,重启,生成...



1> 小智..:

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

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

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

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


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

2> broofa..:

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

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

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


到目前为止没有碰撞:)

3> Ken Smith..:

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

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

只是一个FYI.


我们的指标系统遇到了同样的问题。使用“ node-uuid”模块在浏览器中生成会话ID时,看到数千次UUID冲突。原来一直是googlebot。谢谢!
推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有