基于定时器的主键同步算法

问题描述 投票:0回答:1

这个会产生碰撞:


(() => {
    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
})();

基于定时器的主键将用于将数据同步到多个设备以确保效率。在后续同步中,只会从服务器中提取上次同步时间及以后的数据。

javascript data-synchronization
1个回答
0
投票

不,最后的代码中不能发生冲突,因为即使 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
})();

就够了。

© www.soinside.com 2019 - 2025. All rights reserved.