许多人说ObjectId包含:
并且如果objectId包含所有这些元素,那么可以确保所有id在整个集群中都是唯一的。但是文档说没有机器和进程ID,而objectId仅包含一个随机值(https://docs.mongodb.com/manual/reference/method/ObjectId)
我查看了Java mongo驱动程序ObjectId的生成,并找到了证据:
SecureRandom secureRandom = new SecureRandom(); RANDOM_VALUE1 = secureRandom.nextInt(0x01000000); RANDOM_VALUE2 = (short) secureRandom.nextInt(0x00008000); // ... private ObjectId(final int timestamp, final int counter, final boolean checkCounter) { this(timestamp, RANDOM_VALUE1, RANDOM_VALUE2, counter, checkCounter); }
因此,很可能两台计算机生成相同的随机数(因此,生成的所有id很有可能发生冲突(虽然,概率确实很低,但仍然是)。为什么做出这样的决定?它仍然完全独特,但我听不懂吗?谢谢!
[许多人说ObjectId包含:一个4字节的值,代表Unix时代以来的秒数(直到2106年,它不会用完秒数),一个3字节的机器标识符(通常是...
提及的ID结构仅适用于Mongo数据库直接生成的ID,不适用于Java应用程序/框架。 ID生成阶段的Java应用程序不知道实际的插入将在哪里执行。