【问题标题】:Can a 4 byte timestamp value in MongoDb ObjectId overflow?MongoDb ObjectId 中的 4 字节时间戳值会溢出吗?
【发布时间】:2021-04-26 17:47:46
【问题描述】:

如果在某个时间,纪元是ffffffff,那么此时创建的 objectId 类似于:

ffffffff15580625bcb65364

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

【问题讨论】:

    标签: mongodb epoch bson objectid


    【解决方案1】:

    那么,[Unix 纪元以 32 位翻转] 之后创建的 ObjectId 可能是什么?

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

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

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

    但其他实现可能会截断(从最重要或最不重要的一侧)时间戳,以将其强制转换为 ObjectId 的 32 个可用位。

    ObjectId 值本身实际上必须具有准确的时间戳 - 它需要在集合中是唯一的,并且它“通常会增加”,但 MongoDB-the-database 不会关心 ObjectId 值是否在某个点环绕为零。

    【讨论】:

      【解决方案2】:

      正如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 个字节的时间戳。

      【讨论】:

      • 是的,2106的问题很可怕。所有的 Linux 系统都会崩溃,人类肯定会灭亡。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多