MongoDB的ObjectIds是如何生成的?

时间:2011-04-28 11:22:28

标签: mongodb

他们有点随机吗?

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

5 个答案:

答案 0 :(得分:36)

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

  

BSON ObjectID是12字节的值   由4字节时间戳组成   (自纪元以来的秒数),一个3字节   machine id,一个2字节的进程id和a   3字节计数器

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

答案 1 :(得分:12)

继承了MongoDB ObjectID(http://jsfiddle.net/icodeforlove/rN3zb/

的javascript实现
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)
    };
}

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

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

答案 2 :(得分:11)

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

您还可以生成自己的ObjectIds。如果您想使用业务标识符,这将特别有用。

易碎性

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

答案 3 :(得分:1)

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

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

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

3字节的机器标识符(通常从MAC地址派生)

2字节的进程ID,和

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

答案 4 :(得分:0)

摘自MongoDB官方文档links
它显示:

  

ObjectId
  ObjectId很小,可能唯一,可以快速生成,并且   下令。 ObjectId值由12个字节组成,其中前四个   字节是反映ObjectId创建的时间戳。   具体来说:

     

一个4字节的值,表示自Unix时代以来的秒数,
    一种   5字节随机值,
    一个3字节的计数器,以随机数开头   值。
    在MongoDB中,存储在集合中的每个文档都需要一个   充当主键的唯一_id字段。如果插入的文件   省略_id字段,MongoDB驱动程序会自动生成一个   _id字段的ObjectId。