MongoDb ObjectId 中的 4 字节时间戳值是否会溢出?

Can a 4 byte timestamp value in MongoDb ObjectId overflow?

如果在某个时候,epoch 是 ffffffff,则此时创建的 objectId 类似于:

ffffffff15580625bcb65364

那么,1秒后创建的ObjectId可能是什么?

docs所说,时间戳用4字节表示。

4-byte timestamp value, representing the ObjectId’s creation, measured in seconds since the Unix epoch

4字节是从-2,147,483,648到2,147,483,647个值,所以,也就是4,294,967,295个值。

根据 unix 时间戳,从 4,294,967,295 开始的日期是:GMT:2106 年 2 月 7 日,星期日 6:28:15

在此日期之后,ObjectId 将无法存储时间戳。

那么,ObjectId会溢出吗?在 85 年内,每个新创建的 ObjectId 都会失败,因为它无法创建只有 4 个字节的时间戳。

Then, what could be the ObjectId created after [the Unix epoch rolls over in 32 bits]?

这将取决于具体的实现、它的编程语言和它们对数学计算的处理。

当某些实现和语言将自 Unix 纪元以来的秒数检索为 64 位整数(这在今天很常见)然后尝试使用超过 32 位的值时,可能会出错ObjectId 生成的大小。如果发生这种情况,驱动程序将无法生成 ObjectId,因此如果应用程序使用其他生成策略提供 _id 值,它可能无法插入文档。

在其他实现中,时间戳本身可能会滚动到零,此时 ObjectId 生成将以非常小的时间戳值成功。

然而其他实现可能会截断(从最高或最低有效端)时间戳以将其强制为 ObjectId 的 32 个可用位。

ObjectId 值本身实际上 没有 具有准确的时间戳 - 它需要在集合中是唯一的并且它“通常在增加”但是 MongoDB-数据库不会关心 ObjectId 值是否在某个时候回绕到零附近。