java - 为什么 mongodb java 驱动程序在 ObjectId 中使用随机字节而不是机器 id?
问题描述
很多人说 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 很可能会发生冲突。为什么会做出这样的决定?它仍然是完全独特的,但我不明白吗?谢谢!
编辑:嗯,问题的目的是:我应该实现MAC地址和processId的检索并自己生成ObjectId还是留下随机的5个字节数,因为没有区别?
解决方案
为什么 mongodb java 驱动程序在 ObjectId 中使用随机字节而不是机器 id?
同一份文件提供了理由:
随机值:最初,该字段由机器 ID 和进程 ID 字段组成。由于实施选择,驱动程序之间存在许多分歧,并且机器 ID 字段传统上使用 MD5 散列算法,该算法不能在符合 FIPS 的机器上使用。为了允许所有驱动程序和 MongoDB 服务器之间的类似行为,这两个字段已被整理成一个 5 字节的随机值,对机器和进程来说是唯一的。
您不需要实现 ObjectId 生成,因为所有 MongoDB 驱动程序都必须提供此功能。
推荐阅读
- azure-spatial-anchors - Anchor 有时会随机跳开
- ios - 为 pjsip 构建时,在 libssl.a 中找不到架构 x86_64 的符号
- android - 具有自定义 GATT 服务的网络蓝牙?
- c# - 脚手架创建视图返回 System.Web.Mvc.WebViewPage
.Model.get 返回空值。发帖前 - java - 将 ArrayList 转换为 JSON 文件
- c# - 我怎样才能得到一个排序的`列表
` 基于关联的数字索引 - ios - 根据选择自动向下滚动
- php - 如何从 Laravel 集合中获取最小日期
- node.js - Id 没有从嵌套数组中删除
- gremlin - 无法使用图形管理实例