使用performance.now()而不是date.now()来防止时间戳碰撞
#javascript #性能 #timestamps

说您有一系列数据条目,需要将唯一标识符附加到每个条目。流行的方法将使用date.now()作为唯一标识符。这种方法的问题在于,有两个或多个具有相同标识符的条目。这是因为按日期返回的时间戳记(now()的分辨率为一毫秒。因此,很可能您可以在数据条目的唯一标识符之间发生碰撞。让我们考虑以下示例,该示例循环5次,打印一个date.now()时间戳每个循环。让我们打开我们的命令提示符,让我们在节点中运行以下代码(要输入节点,只需在命令提示符中键入单词,假设您已经在环境中已有它)。

代码:

for (let index = 0; index < 5; index++) {
    console.log(Date.now())
}

输出:

1691741535783
1691741535784
1691741535785 < Identical
1691741535785 < Identical
1691741535785 < Identical

您在输出中看到的最后三个输出是相同的,因此,如果将它们用作唯一标识符,则会发生碰撞。

输入performance.now()

与date.now()不同的时间戳记,由performance.now(now()返回的时间戳表示浮点数,其分辨率最高为5微秒,而不是date.now()timestamps的一个毫秒的分辨率。另外,dervility.now()时间戳总是以恒定速率与系统时钟无关,而系统时钟可以手动调整或容易通过软件(例如网络时间协议)更改。让我们看看我们上面做过的相同示例,但是这次是performance.now()。

代码:

for (let index = 0; index < 5; index++) {
    console.log(performance.now())
}

输出:

7908.96749997139
7910.144699931145
7910.284399986267
7910.412899971008
7910.533899903297

让我们通过同时记录两个时间戳来进一步测试performance.now()。

代码:

console.log(`${ performance.now() } ${ performance.now() }`)

输出:

773756.6698999405 773756.6811999083

您可以看到,即使您同时记录它,时间戳也不同,因此没有机会发生碰撞。我强烈建议您查看MDN文档的性能。