首页 > 解决方案 > 为什么 mongodb java 驱动程序在 ObjectId 中使用随机字节而不是机器 id?

问题描述

很多人说 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 很可能会发生冲突。为什么会做出这样的决定?它仍然是完全独特的,但我不明白吗?谢谢!

编辑:嗯,问题的目的是:我应该实现MAC地址和processId的检索并自己生成ObjectId还是留下随机的5个字节数,因为没有区别?

标签: javamongodbbson

解决方案


为什么 mongodb java 驱动程序在 ObjectId 中使用随机字节而不是机器 id?

此行为由 ObjectId 规范强制执行

同一份文件提供了理由

随机值:最初,该字段由机器 ID 和进程 ID 字段组成。由于实施选择,驱动程序之间存在许多分歧,并且机器 ID 字段传统上使用 MD5 散列算法,该算法不能在符合 FIPS 的机器上使用。为了允许所有驱动程序和 MongoDB 服务器之间的类似行为,这两个字段已被整理成一个 5 字节的随机值,对机器和进程来说是唯一的。

您不需要实现 ObjectId 生成,因为所有 MongoDB 驱动程序都必须提供此功能。


推荐阅读