Why the bson java implementation uses 4 bytes inc field?

余生长醉 提交于 2019-12-24 16:42:55

问题


In BSON Java implementation, an ObjectId is composed by 3 pieces (source code: http://grepcode.com/file/repo1.maven.org/maven2/org.mongodb/mongo-java-driver/2.9.0/org/bson/types/ObjectId.java#ObjectId.%3Cinit%3E%28int%2Cint%2Cint%29 ):

XXXX   XXXX          XXXX
-------------------------
time   machine&pid   inc

(each X represents a byte)

this is a bit different from what's described in document (doc: http://docs.mongodb.org/manual/core/object-id/ )

XXXX   XXX       XX    XXX
--------------------------
time   machine   pid   inc

(each X represents a byte)

Can anyone let me know why the java-driver didn't follow the spec?

Thanks!


回答1:


I will put this as answer since it is a bit long for a comment.

There are a couple of JIRA links to this:

  • https://jira.mongodb.org/browse/JAVA-81
  • https://jira.mongodb.org/browse/JAVA-337

The second acknowledges that the spec is different under Java however makes no reference as to why.

If I were to make a guess it could be due to the way the PID and machine id in Java works, it could be related to: https://jira.mongodb.org/browse/JAVA-586.

You may find your answer better on the Google Group: mongodb-user since the maintainers hang out there.




回答2:


I expect the original intent of an ObjectID was to generate a reasonably unique primary key, rather than packing fields that drivers would then start parsing as data.

As the MongoDB ecosystem has evolved, some developers have found it useful to interpret the ObjectID from multiple drivers as well as ensure consistency of generated IDs.

If you look at the BSON spec you will see there are a few subtypes for UUID used by older drivers, and various changes for interoperability. For example, there is mention on PYTHON-387 of supporting "legacy" byte orders and endianness for the C# and Java drivers.

As per JAVA-337 in the MongoDB issue tracker, the Java driver's ObjectID inconsistency is planned to be addressed in the 3.0 Java driver release.




回答3:


I cannot explain why they are different, but I can tell you that the Python driver generates object ids using the same approach that the Java one does:

https://github.com/mongodb/mongo-python-driver/blob/master/bson/objectid.py



来源:https://stackoverflow.com/questions/13778071/why-the-bson-java-implementation-uses-4-bytes-inc-field

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!