这个会产生碰撞:
(() => {
const a = [];
for (let i = 0; i < 20_000; ++i) {
const pk = Date.now();
a.push(pk);
}
const uniqueItems = new Set(a);
console.log(a.length, uniqueItems.size); // 20000 3
console.log(a.length === uniqueItems.size); // false
})();
即使我将
now()
(精确到毫秒)乘以1000,主键是否也有可能发生碰撞?
(() => {
const a = [];
for (let i = 0; i < 20_000; ++i) {
const pk = Date.now() * 1_000 + i;
a.push(pk);
}
const uniqueItems = new Set(a);
console.log(a.length, uniqueItems.size); // 20000 20000
console.log(a.length === uniqueItems.size); true
})();
基于定时器的主键将用于将数据同步到多个设备以确保效率。在后续同步中,只会从服务器中提取上次同步时间及以后的数据。
不,最后的代码中不能发生冲突,因为即使 Date.now() 返回相同的值,每个 pk 也将严格大于前一个。
但是,这与乘以 1000 无关,这是因为您在
+i
中添加了 Date.now()
:
(() => {
const a = [];
for (let i = 0; i < 20_000; ++i) {
const pk = Date.now()+i;
a.push(pk);
}
const uniqueItems = new Set(a);
console.log(a.length, uniqueItems.size); // 20000 3
console.log(a.length === uniqueItems.size); // false
})();
就够了。