在 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 中运行的 Web 应用程序。
  • 16 个用户。
  • 这些用户在过去两个月中生成了大约 4000 个 UUID。
  • 我遇到了大约 20 次冲突 - 例如,今天生成的新 UUID 与大约两个月前(不同用户)相同。

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

原文由 Muxa 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 480
2 个回答

我最好的猜测是 Math.random() 由于某种原因在您的系统上损坏(听起来很奇怪)。这是我看到的第一份关于有人发生碰撞的报告。

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

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

原文由 broofa 发布,翻译遵循 CC BY-SA 4.0 许可协议

确实有冲突,但仅限于谷歌浏览器。查看我在 Google Chrome 随机数生成器问题 中的主题经验

似乎碰撞只发生在 Math.random 的前几次调用中。因为如果您只运行上面的 createGUID / testGUIDs 方法(这显然是我尝试的第一件事),它就可以正常工作而不会发生任何冲突。

因此,要进行完整测试,需要重启 Google Chrome,生成 32 字节,重启 Chrome,生成,重启,生成,等等。

原文由 Veselin Kulov 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题