【发布时间】:2014-08-12 21:40:36
【问题描述】:
MongoDB 对每个文档 _id 使用哪种算法?
我找不到任何关于它的文档。是某种 uuid 吗?
【问题讨论】:
标签: mongodb
MongoDB 对每个文档 _id 使用哪种算法?
我找不到任何关于它的文档。是某种 uuid 吗?
【问题讨论】:
标签: mongodb
ObjectId 是“_id”的默认类型,它使用 12 个字节的存储空间,这为它们提供了 24 个十六进制数字的字符串表示形式:每个字节 2 个数字。这是在客户端生成的。如果您快速连续创建多个新的ObjectId,您可以看到每次只有最后几位数字发生变化。此外,ObjectId 中间的几个数字会发生变化(如果将创建间隔几秒钟)。这是因为创建 ObjectId 的方式。 ObjectId的12个字节生成如下:
0|1|2|3 4|5|6 7|8| 9|10|11
Timestamp machine PID Increment
ObjectId 的前四个字节是以秒为单位的时间戳。这提供了几个有用的属性:时间戳与接下来的五个字节组合时,提供了以秒为粒度的唯一性。因为时间戳排在第一位,这意味着 ObjectIds 将按大致插入顺序排序(这不是强保证)。 在这四个字节中存在每个文档创建时间的隐含时间戳。
ObjectId 的下三个字节是生成它的机器的唯一标识符。这通常是机器主机名的哈希值。通过包含这些字节,可以保证不同的机器不会产生冲突的 ObjectId。
为了在单个机器上同时生成 ObjectId 的不同进程之间提供唯一性,接下来的两个字节取自 ObjectId 生成进程的进程标识符 (PID)。 ObjectId 的前九个字节保证了它在一秒钟内跨机器和进程的唯一性。最后三个字节只是一个递增计数器,负责在单个进程中在一秒钟内实现唯一性。
这允许每个进程在一秒钟内生成多达 256^3 (16,777,216) 个唯一的 ObjectId。
【讨论】: