Mongodb BSON中on ObjectId部分的Endianess

Mongodb BSON中on ObjectId部分的Endianess,mongodb,endianness,bson,Mongodb,Endianness,Bson,在尝试使用ObjectID手动查询MongoDB中的对象时,我发现MongoDB驱动程序中存在问题。对BSON ObjectId部分内容的解释似乎是错误的。我试图修复它,但找不到一个像样的规范使它正确 在中,objectId定义为12字节: * a 4-byte value representing the seconds since the Unix epoch, * a 3-byte machine identifier, * a 2-byte process id, and * a 3-b

在尝试使用ObjectID手动查询MongoDB中的对象时,我发现MongoDB驱动程序中存在问题。对BSON ObjectId部分内容的解释似乎是错误的。我试图修复它,但找不到一个像样的规范使它正确

在中,objectId定义为12字节:

* a 4-byte value representing the seconds since the Unix epoch,
* a 3-byte machine identifier,
* a 2-byte process id, and
* a 3-byte counter, starting with a random value
在网上,我发现有人提到

"Note that the timestamp and counter fields must be stored big endian unlike the rest of BSON."
但我找不到它的来源。这是有意义的,因为我在mongo中看到的ID确实是时间戳的大端。大多数objectid都设置了零值,所以很难计算。我的问题是找到big-endian定义的来源,如果真的是这样的话

* time is big-endian
* machine id is little-endian
* process id is little-endian
* counter is big-endian

是的,这显然是正确的。发件人:

BSON对象id的典型内容是一个12字节的值,由4字节的时间戳(自历元起的秒数)、3字节的机器id、2字节的进程id和3字节的计数器组成请注意,时间戳和计数器字段必须以大端存储,这与BSON的其他字段不同。这是因为它们是逐字节比较的,我们希望确保顺序基本上是递增的

(我的重点)


还有很多endian代码用来交换时间戳,因此注释似乎没有过时,字节排序也很有意义。

查看Go驱动程序的源代码(MongoDB人曾称赞其为最先进、编写良好的驱动程序)很明显,ObjectID中的所有字段都存储为big-endian:

它背后的目的无疑是能够按字典顺序(逐字节)对objectid进行排序,并使数值按顺序显示


机器标识符被视为一个不透明的3字节数组,因此它不一定按任何顺序排列。

实际上,我写的似乎不是这样。我比较了mongo shell的行为和我自己的解码。显然,ObjectId的解码似乎完全是大端的。我打开这个问题是因为“…和计数器字段”也可能意味着所有3个字段都是有意义的。可悲的是,有些事情总是模棱两可