【发布时间】:2011-10-17 22:14:39
【问题描述】:
这与this question 有关。我正在使用来自this answer 的以下代码在 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 个用户。
- 这些用户在过去两个月内生成了大约 4000 个 UUID。
- 我遇到了大约 20 次冲突 - 例如,今天生成的新 UUID 与大约两个月前(不同的用户)相同。
是什么导致了这个问题,我该如何避免?
【问题讨论】:
-
结合一个好的随机数和当前时间(以毫秒为单位)。随机数在同一时间发生碰撞的几率真的非常非常低。
-
@jfriend00 如果你需要这样做,那么它不是一个“好的随机数”,甚至不是一个像样的伪随机数。
-
(r&0x3|0x8)部分的含义/评估是什么? -
追加一个 Date.now().toString() 怎么样?
-
您的架构中有一个大问题,与 UUID 无关——客户端可能故意生成冲突的 ID。仅由您信任的系统生成 ID。不过,作为一种解决方法,在客户端生成的 ID 前面加上 user_id,这样攻击者/故障客户端只能与自己发生冲突(并在服务器端进行处理)。
标签: javascript random uuid collision