ObjectId基础
MongoDB ObjectId的一个例子60c468e6101bf215dc9fa835
一个24个字符组成的字符串,每个字符都是一个16进制字符,因此总共 96 bit = 12 byte
ObjectId组成
4 byte 时间戳(timestamp) + 3 byte 机器哈希(machine hash) + 2 byte 进程id(process id) + 3 byte 自增计数(counter)
4 byte 时间戳
0x60c468e6
= 1623484646
= 2021-06-12 15:57:26
(单位:秒)
时间戳记录了文档创建的时间
3 byte 机器哈希
0x101bf2
是所在主机的唯一标识符,一般是机器主机名的散列值,这样就确保了不同主机生成不同的机器的 hash 值,确保在分布式中不造成冲突,这也就是说在同一台机器生成的 ObjectId 中间(第9到15位字符)的字符串都是一模一样的原因。
2 byte 进程id
机器哈希是为了确保在不同机器产生的 ObjectId 不冲突,而 pid 就是为了在同一台机器不同的 mongodb 进程中产生的 ObjectId 不冲突,在这里是0x15dc
3 byte 自增计数
前面的9个字节是保证了一秒内不同机器不同进程生成 ObjectId 不冲突,最后面的3个字节0x9fa835
是一个自动增加的计数器,用来确保在同一秒内产生的 ObjectId 也不会发生冲突,允许 256 的 3 次方等于 16777216 条记录的唯一性。也就是说每秒钟可以产生 16777216 个 ID,足够使用了,如果还不够,可以分机器,分集群,或者让客户端产生 ObjectId。
参考: