BSON中ObjectId部分的Endianess

时间:2014-05-08 10:44:04

标签: mongodb endianness bson

尝试使用ObjectID手动查询MongoDB中的对象时,我发现mongodb驱动程序中存在问题。对BSON ObjectId部分的解释似乎是错误的。我尝试修复它,但找不到合适的规格来使它正确。

mongodb documentation中,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

2 个答案:

答案 0 :(得分:2)

是的,这显然是正确的。来自the mongodb server source code at src/mongo/bson/oid.h

  

BSON ObjectID的典型内容是一个12字节的值,包括一个4字节的时间戳(自纪元以来的秒数),一个3字节的机器ID,一个2字节的进程ID和一个3字节的计数器。 请注意,时间戳和计数器字段必须以大端字节存储,与BSON的其余部分不同。这是因为它们是逐字节比较的,我们希望确保大致增加的顺序。

(强调我的)。

还有很多用于时间戳的字节序交换代码,因此评论似乎没有过时或任何东西,字节排序的东西也是有道理的。

答案 1 :(得分:0)

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

http://bazaar.launchpad.net/+branch/mgo/v2/view/head:/bson/bson.go#L295

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

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