许多人说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个字节的随机数,因为没有区别?
为什么mongodb java驱动程序在ObjectId中使用随机字节而不是机器ID?
此行为由ObjectId规范规定。
同一文档提供了基本原理:
随机值:最初,此字段由“机器ID”和“进程ID”字段组成。由于实现方式的选择,驱动程序之间存在许多分歧,并且“机器ID”字段传统上使用MD5哈希算法,而该算法不能在FIPS兼容机器上使用。为了使所有驱动程序和MongoDB服务器之间都具有类似的行为,这两个字段已整理到一个5字节的随机值中,这对于计算机和进程是唯一的。
您不需要实现ObjectId生成,因为所有MongoDB驱动程序都必须提供此功能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句