MongoDB';生成了什么对象?

MongoDB';生成了什么对象?,mongodb,Mongodb,它们有点随机吗 我的意思是……人们能把他们分开吗? 它们通常由驱动程序本身在客户端生成。例如,在ruby中,可以使用BSON::ObjectID: 您还可以生成自己的objectid。如果您想使用业务标识符,这尤其有用 易碎性 使用驱动程序生成的ObjectID时,值为低 当使用自己的业务Id时,根据其可预测性(登录、连续标识符…)略高 它们不是随机的,很容易预测: BSON对象ID是一个12字节的值 由4字节的时间戳组成 (自纪元起的秒数),一个3字节 机器id、2字节进程id和 3字

它们有点随机吗

我的意思是……人们能把他们分开吗?

它们通常由驱动程序本身在客户端生成。例如,在ruby中,可以使用BSON::ObjectID:

您还可以生成自己的objectid。如果您想使用业务标识符,这尤其有用

易碎性
  • 使用驱动程序生成的ObjectID时,值为低
  • 当使用自己的业务Id时,根据其可预测性(登录、连续标识符…)略高

它们不是随机的,很容易预测:

BSON对象ID是一个12字节的值 由4字节的时间戳组成 (自纪元起的秒数),一个3字节 机器id、2字节进程id和 3字节计数器


这里是MongoDB ObjectID()的javascript实现

所以,如果你有足够的信息,他们会泄露很多关于你的基础设施的信息。您还知道所有对象的创建日期


IE:您有多少台服务器,以及每台服务器正在运行多少个进程。

默认情况下,MongoDB数据库驱动程序生成一个ObjectID标识符,该标识符分配给每个文档的_id字段。在许多情况下,ObjectID可以用作应用程序中的唯一标识符

ObjectID是一个96位的数字,其组成如下:

一个4字节的值,表示自Unix纪元以来的秒数(在2106年之前不会耗尽秒数)

3字节的机器标识符(通常来自MAC地址)

2字节的进程id,以及


3字节计数器,以随机值开头。

来自MongoDB官方文档
它表明:

ObjectId
objectid很小,可能是唯一的,生成速度很快,而且 命令。ObjectId值由12个字节组成,其中前四个字节 字节是反映ObjectId创建的时间戳。 具体而言:

表示自Unix纪元以来的秒数的4字节值,
A. 5字节随机值,和
一个3字节的计数器,以随机 价值。
在MongoDB中,存储在集合中的每个文档都需要 充当主键的唯一_id字段。如果是插入的文档 如果省略_id字段,MongoDB驱动程序将自动生成 _id字段的ObjectId


是的,如果您有可供分析的相关对象,则可以预测它们。但是我想你会同意,在传统的DBs中,猜测比通常的标识列要困难得多……是的,增量ID更容易猜测,但是Mongo ObjectId不能被认为是安全的。而且因为它们不是随机的,并且很容易被分解,你可以在Mongo shell中这样做:ObjectId().getTimestamp()要知道它是何时创建的。uuid不提供更多的唯一性吗?使用此算法似乎不可能生成重复的ID。。。“机器”-id来自何处?5字节的“随机值”似乎不是随机的。其他答案表明它是机器标识符和进程id的组合。@Jontia谢谢,当逐个插入时,5字节的随机值是不可变的!仅供参考:链接文档不再与引用的文本一致——它提到了一个“5字节随机值”,而不是使用“id”值。因此,本质上,有一个32位时间戳与一个64位随机初始化计数器连接。结论是一样的:如果您从同一个系统中有一个有效的值,那么很容易猜测其他ObjectId值。
function ObjectIdDetails (id) {
    return {
        seconds: parseInt(id.slice(0, 8), 16),
        machineIdentifier: parseInt(id.slice(8, 14), 16),
        processId: parseInt(id.slice(14, 18), 16),
        counter: parseInt(id.slice(18, 24), 16)
    };
}