MongoDB-ObjectId生成原理

本文深入解析了MongoDB ObjectId的生成原理,包括4byte时间戳、3byte机器哈希、2byte进程id和3byte自增计数的详细解释。ObjectId确保了在分布式环境中的唯一性,每秒可生成16777216个独特的ID,满足高并发需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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。

参考:

从根上理解MongoDB的ObjectId生成原理!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值