MongoDB使用哪种算法用于_id

时间:2014-06-22 21:31:13

标签: mongodb

MongoDB对每个文档使用哪种算法_id

我找不到任何关于它的文档。它是某种形式的吗?

1 个答案:

答案 0 :(得分:10)

ObjectId是" _id"的默认类型。它使用12个字节的存储空间,这为它们提供了一个24位十六进制数字的字符串表示形式:每个字节2位数。这是在客户端生成的。如果您快速连续创建多个新的ObjectId,您可以看到每次只更改最后几位数字。此外,ObjectId中间的几个数字将会改变(如果你将创作空间隔开几秒钟)。这是因为ObjectIds的创建方式。 ObjectId的12个字节生成如下:

0|1|2|3     4|5|6    7|8|   9|10|11 

Timestamp  machine   PID   Increment

ObjectId的前四个字节是以秒为单位的时间戳。这提供了一些有用的属性:时间戳与下一个五个字节组合时,以一秒的粒度提供唯一性。因为时间戳首先出现,这意味着ObjectIds将按粗略的顺序排序(这不是一个强大的保证)。 在这四个字节中存在一个隐式时间戳,表示每个文档的创建时间。

ObjectId的后三个字节是生成它的机器的唯一标识符。这通常是机器主机名的哈希值。通过包含这些字节,可以保证不同的机器不会产生冲突的ObjectIds。

为了在单个机器上同时生成ObjectId的不同进程之间提供唯一性,接下来的两个字节取自ObjectId生成进程的进程标识符(PID)。 ObjectId的前九个字节保证了它在一秒钟内跨机器和进程的唯一性。最后三个字节只是一个递增计数器,它负责单个进程中一秒内的唯一性。

这允许在一秒钟内为每个进程生成最多256 ^ 3(16,777,216)个唯一的ObjectIds。