纳秒时间戳不适合做唯一标识符

在现代系统中,纳秒时间戳碰撞的频率有多高?
答案是:非常频繁,比如在同时读取所有 4 个物理内核的时钟时,有 5%的样本会发生碰撞。

因此,采用原始纳秒时间戳作为唯一标识符是不安全的。

 test program on Github是一个小型测试程序。
使用了 Go,它在每次调用 time.Now() 时都会记录 "绝对 "时间和 "单调时钟 "相对时间,
因此既比较了连续时间戳之间的相对差值,也比较了绝对时间戳。

不出所料,这种行为取决于系统,在 Mac OS X 和 Linux 上观察到的结果截然不同。

  • 在 Linux 上,在单个线程内,绝对时间和单调时间都会增加,最小增量为 32 ns。线程之间,约有 5% 的绝对时间与其他线程完全相同。即使在 4 核系统上使用 2 个线程,也有约 2% 的时间戳发生碰撞。
  • 在 Mac OS X 上:绝对时间的分辨率为微秒级,因此当我重复同样的测试时,碰撞的次数会达到天文数字。即使在一个线程内,也经常观察到单调时钟不递增的情况。