面试题答案
一键面试- 时间戳(Timestamp):
- 机制:ObjectId 的前 4 个字节是时间戳,记录了 ObjectId 创建的时间。这个时间戳以秒为单位,精确到秒级。
- 作用:不同节点生成 ObjectId 时,由于时间的自然递增特性,时间戳不同能保证大部分情况下生成的 ObjectId 不同。即使在同一秒内,后续还有其他机制来确保唯一性。
- 机器标识(Machine Identifier):
- 机制:接下来的 3 个字节是机器标识,它基于主机的 MAC 地址生成,用来标识生成 ObjectId 的机器。
- 作用:在分布式环境中,不同机器的 MAC 地址通常是唯一的,这就确保了不同机器生成的 ObjectId 具有唯一性的基础,因为即使在同一秒内不同机器生成的 ObjectId,由于机器标识不同,也不会重复。
- 进程 ID(Process ID):
- 机制:再接下来的 2 个字节是进程 ID,它标识了生成 ObjectId 的进程。
- 作用:在同一台机器上可能运行多个进程,进程 ID 可以区分不同进程生成的 ObjectId,避免同一机器上不同进程在同一秒内生成相同 ObjectId 的情况。
- 计数器(Counter):
- 机制:最后 3 个字节是一个自增的计数器,从随机值开始,每次生成 ObjectId 时计数器递增。
- 作用:即使在同一秒内,同一台机器上的同一个进程生成 ObjectId,由于计数器的递增,也能保证生成的 ObjectId 不同。这样,通过时间戳、机器标识、进程 ID 和计数器的组合,确保了在分布式 MongoDB 集群环境下生成的所有 ObjectId 都具有唯一性。