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

MongoDb ObjectId中的4字节时间戳值是否会溢出?,mongodb,epoch,bson,objectid,Mongodb,Epoch,Bson,Objectid,如果在某个时间,epoch是ffffffff,那么此时创建的objectId如下所示: ffffffff15580625bcb65364 那么,1秒后创建的ObjectId是什么呢?如前所述,时间戳由4字节表示 4字节时间戳值,表示ObjectId的创建,自Unix纪元以来以秒为单位测量 4字节是从-2147483648到2147483647的值,因此,也就是4294967295值 根据unix时间戳,从4294967295开始的日期是:GMT:Sunday,2106年2月7日6:28:15

如果在某个时间,epoch是
ffffffff
,那么此时创建的objectId如下所示:

ffffffff15580625bcb65364
那么,1秒后创建的ObjectId是什么呢?

如前所述,时间戳由4字节表示

4字节时间戳值,表示ObjectId的创建,自Unix纪元以来以秒为单位测量

4字节是从-2147483648到2147483647的值,因此,也就是4294967295

根据unix时间戳,从4294967295开始的日期是:GMT:Sunday,2106年2月7日6:28:15

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

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

如前所述,时间戳由4个字节表示

4字节时间戳值,表示ObjectId的创建,自Unix纪元以来以秒为单位测量

4字节是从-2147483648到2147483647的值,因此,也就是4294967295

根据unix时间戳,从4294967295开始的日期是:GMT:Sunday,2106年2月7日6:28:15

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

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

那么,在[Unix纪元以32位滚动]之后创建的ObjectId是什么

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

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

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

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

ObjectId值本身实际上不必有准确的时间戳——它在集合中必须是唯一的,并且它“通常在增加”,但MongoDB数据库不会在意ObjectId值是否在某个点包装为零

那么,在[Unix纪元以32位滚动]之后创建的ObjectId是什么

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

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

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

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


ObjectId值本身实际上不必有一个准确的时间戳——它在集合中必须是唯一的,并且它“通常在增加”,但MongoDB数据库不会在意ObjectId值是否在某个点被包装为零。

是的,2106的问题很可怕。所有Linux系统都将崩溃,人类必将灭亡。是的,2106的问题是可怕的。所有Linux系统都将崩溃,人类必将灭亡。