Why the bson java implementation uses 4 bytes inc

2019-08-03 00:53发布

问题:

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