【发布时间】:2018-01-15 22:29:55
【问题描述】:
我正在使用以下 JS 函数来生成唯一 ID,这是我从另一个 StackOverflow 线程获得的:
function generateUniqueID() {
return Math.round(new Date().getTime() + (Math.random() * 100));
}
我看到它结合了当前的日期/时间和一个额外的随机器。
尽管如此,我证实我在快速添加具有 ID 的项目的每 4 次或 5 次操作中都会发生冲突。
在 JS 循环中调用该函数以从当前元素列表中生成 ID。
jQuery.each(mainEvents, function(index, item) {
// ...
// Generate gaps
gapEvents.push({"gapEventID" : "event-GAP" + generateUniqueID(),
"other" : other });
}
这个功能不可靠吗?是否允许在快速 JS 循环迭代中发生冲突?
我几乎排除了“外部原因”(即这个函数不是罪魁祸首,但可能是其他原因),但如果是这样的话,我不明白为什么 Math.random() 不会保留我很安全。
【问题讨论】:
-
确实。我在一个 10000 项数组上尝试过。当我从该数组创建一个集合时,它只保留了 10000 个值中的大约 119 个
-
但是为什么它不起作用?当然,这些是伪随机数,但我们仍然不希望碰撞像这样频繁吗?
-
日期可能没有帮助,它循环执行的速度非常快,每个项目的值可能应该相同。不知道为什么 20% 的 id 会一直相同,但我希望至少有 1% 是相同的。不过,如果您想推出自己的功能,可以使用 ES6 Set 轻松跟踪唯一 ID。
标签: javascript random