为什么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个字节的随机数,因为没有区别?

D.SM:

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

此行为由ObjectId规范规定

同一文档提供了基本原理

随机值:最初,此字段由“机器ID”和“进程ID”字段组成。由于实现方式的选择,驱动程序之间存在许多分歧,并且“机器ID”字段传统上使用MD5哈希算法,而该算法不能在FIPS兼容机器上使用。为了使所有驱动程序和MongoDB服务器之间都具有类似的行为,这两个字段已整理到一个5字节的随机值中,这对于计算机和进程是唯一的。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么MongoDB Java驱动程序在条件条件下使用随机数生成器?

有Java mongodb驱动程序时,为什么需要scala mongodb驱动程序?

MongoDB 为什么 id 是 -1?

如何在Java mongodb驱动程序中使用“ _id”字段查询文档?

为什么内核使用默认的块驱动程序而不是我的驱动程序代码?

在 Java 中使用 MongoDB 驱动程序 POJO

如何在MongoDB Java驱动程序中使用sureIndex

为什么在MongooseJS / MongoDB中使用.update?

为什么要使用nodeJS驱动程序来操作MongoDB数据库?

Java驱动程序:如何使用Mongodb的updateFirst方法获取更新后的对象的objectId

使用Java驱动程序方法在MongoDB子文档上检索ObjectID

为什么MongoDB不使用索引交集?

为什么MongoDB不使用索引交集?

为什么MongoDB不使用全索引

如何在Java mongodb驱动程序中使用“ _id”字段而不使用集合名称来查询文档?

MongoDB:使用Java驱动程序拉

为什么加载的模块不是设备的驱动程序?

为什么mongoDB Node驱动程序正在创建不需要的连接?

为什么.NET MongoDb驱动程序查询速度非常慢?

为什么生成实例池的MongoDB节点驱动程序会销毁错误?

为什么 mongodb 驱动程序不能处理 $elemMatch 或任何嵌入式查询?

为什么 MongoDB C# 驱动程序默认不使用 BsonType.Decimal128 表示小数?

将PHP升级到版本7后,为什么不能使用mongodb驱动程序?

将PHP升级到版本7后,为什么不能使用mongodb驱动程序?

为什么TokenAwarePolicy不是Datastax Java驱动程序的默认设置

为什么在MongoDB或CouchDB中使用Javascript而不是Java,C ++等其他语言?

Spring中使用Java驱动程序的无尽MongoDB ReplicaSetStatus更新程序异常

为什么我应该使用CUDA驱动程序API而不是CUDA运行时API?

为什么NodeJ通常使用MongoDB而不是Mysql?