【发布时间】:2021-04-26 17:47:46
【问题描述】:
如果在某个时间,纪元是ffffffff,那么此时创建的 objectId 类似于:
ffffffff15580625bcb65364
那么,1 秒后创建的 ObjectId 可能是什么?
【问题讨论】:
标签: mongodb epoch bson objectid
如果在某个时间,纪元是ffffffff,那么此时创建的 objectId 类似于:
ffffffff15580625bcb65364
那么,1 秒后创建的 ObjectId 可能是什么?
【问题讨论】:
标签: mongodb epoch bson objectid
那么,[Unix 纪元以 32 位翻转] 之后创建的 ObjectId 可能是什么?
这将取决于具体的实现、其编程语言及其对数学计算的处理。
某些实现和语言在检索自 Unix 纪元以来的秒数作为 64 位整数(今天很常见)然后尝试使用大小超过 32 位的值时可能会出错用于 ObjectId 生成。如果发生这种情况,驱动程序将无法生成 ObjectId,因此如果应用程序使用其他生成策略未提供 _id 值,它可能无法插入文档。
在其他实现中,时间戳本身可能会回滚到零,此时 ObjectId 生成将成功并具有非常小的时间戳值。
但其他实现可能会截断(从最重要或最不重要的一侧)时间戳,以将其强制转换为 ObjectId 的 32 个可用位。
ObjectId 值本身实际上必须具有准确的时间戳 - 它需要在集合中是唯一的,并且它“通常会增加”,但 MongoDB-the-database 不会关心 ObjectId 值是否在某个点环绕为零。
【讨论】:
正如docs所说,时间戳用4字节表示。
4 字节时间戳值,表示 ObjectId 的创建,以 Unix 纪元以来的秒数为单位
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 个字节的时间戳。
【讨论】: