在uint32中存储自Epoch以来的毫秒是否安全

Is it safe to store milliseconds since Epoch in uint32

本文关键字:是否 安全 uint32 存储 Epoch      更新时间:2023-10-16

我目前正在重写一些旧代码,结果发现:

gettimeofday(&tv, NULL);
unsigned int t = tv.tv_sec * 1000 + tv.tv_usec / 1000;

这看起来真的像是他们试图将Epoch以来的毫秒数存储在uint32中。当然,我认为这不合适,所以我做了一些测试。

#include <sys/time.h>
#include <stdint.h>
int main() {
    struct timeval tv;
    gettimeofday(&tv, nullptr);
    uint32_t t32 = tv.tv_sec * 1000 + tv.tv_usec / 1000;
    int64_t t64 = tv.tv_sec * 1000 + tv.tv_usec / 1000;
    return 0;
}

我是对的:

(gdb) print t32
$1 = 1730323142
(gdb) print t64
$2 = 1423364498118

所以我想他们所做的是不安全的。但他们在做什么,为什么要这样做,实际发生了什么(在这个例子中,左起10位将丢失,他们只关心diffs)他们仍然保持毫秒精度吗(是)注意,他们通过网络发送这个"时间戳",并且仍然使用它进行计算。

不,它不是"安全的":它牺牲了可移植性、准确性,或者两者兼而有之。

如果你只关心低位,它是可移植的,例如,如果你在网络上发送这些时间,然后在另一边进行查询,最大差值约为400万秒(46天)。

如果您只在int为64位的系统上运行此代码,那么它是准确的。有一些像那样的机器,但不多。

它更安全吗?我可以回答"不"answers"是"。我说不,因为在这一天,我们几乎使用了自1970年1月以来的所有比特(来自32比特的数字)来说明纪元。当你乘以1000(dec)时,你几乎是把所有的比特向左旋转了大约10比特,这意味着失去了精度。

我也可以答应你的回答。在你的问题结束时,你说这个数字被用来考虑网络中数据包的时间戳。问题是:预计寿命会持续多久?10年?10天10秒?以毫秒为精度丢失10位将给您大量时间在两个精度为毫秒的数据包之间进行计算,我想这就是您想要的