MongoDB使用哪种算法用于_id

wut*_*aer 3 mongodb

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

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

Sha*_*ain 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • 我已经在机器名称为hashI的答案中写了这个,请查看uuid与objectId的比较:http://stackoverflow.com/questions/22606364/collision-probability-of-objectid-vs-uuid-in-一个大型分布式系统 (2认同)