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.
| 归档时间: |
|
| 查看次数: |
1875 次 |
| 最近记录: |