MongoDB的ObjectIds是如何生成的?

TIM*_*MEX 24 mongodb

他们有点随机吗?

我的意思是......人们能够将它们分开吗?

Max*_*nce 42

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

BSON ObjectID是一个12字节的值,包括一个4字节的时间戳(自纪元以来的秒数),一个3字节的机器ID,一个2字节的进程ID和一个3字节的计数器

http://www.mongodb.org/display/DOCS/Object+IDs


Cha*_*ira 16

下面是MongoDB ObjectID的javascript实现(http://jsfiddle.net/icodeforlove/rN3zb/)

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)
    };
}
Run Code Online (Sandbox Code Playgroud)

因此,如果您有足够的内容,他们会泄漏有关您的基础架构的相关信息.而且你也知道一切的对象创建日期.

IE:您拥有多少台服务器,以及每台服务器运行的进程数.


Oct*_*Oct 12

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

您还可以生成自己的ObjectIds.如果要使用业务标识符,这尤其有用.

破碎性

  • 使用驱动程序生成的ObjectIds时,为低
  • 使用自己的业务ID时,根据其可预测性(登录,连续标识符......)略高

  • 它很容易预测.你看过这个来源了吗? (2认同)

jit*_*put 8

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

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

一个 4 字节的值,表示自 Unix 纪元以来的秒数(直到 2106 年才会用完秒数)

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

一个 2 字节的进程 ID,以及

一个 3 字节的计数器,从一个随机值开始。