为什么mongodb java驱动程序使用随机字节代替ObjectId中的机器ID?

问题描述 投票:0回答:1

许多人说ObjectId包含:

  • 一个4字节的值,表示自Unix纪元以来的秒数(直到2106年才用完秒数)
  • 一个3字节的机器标识符(通常从MAC地址获得,],>
  • 一个2字节的进程ID,和
  • 一个3字节的计数器,从一个随机值开始。
  • 并且如果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字节的机器标识符(通常是...

java mongodb bson
1个回答
-1
投票

提及的ID结构仅适用于Mongo数据库直接生成的ID,不适用于Java应用程序/框架。 ID生成阶段的Java应用程序不知道实际的插入将在哪里执行。

© www.soinside.com 2019 - 2024. All rights reserved.