【问题标题】:Which algorithm does MongoDB use for _id [duplicate]MongoDB对_id使用哪种算法[重复]
【发布时间】:2014-08-12 21:40:36
【问题描述】:

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

我找不到任何关于它的文档。是某种 uuid 吗?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    ObjectId 是“_id”的默认类型,它使用 12 个字节的存储空间,这为它们提供了 24 个十六进制数字的字符串表示形式:每个字节 2 个数字。这是在客户端生成的。如果您快速连续创建多个新的ObjectId,您可以看到每次只有最后几位数字发生变化。此外,ObjectId 中间的几个数字会发生变化(如果将创建间隔几秒钟)。这是因为创建 ObjectId 的方式。 ObjectId的12个字节生成如下:

    0|1|2|3     4|5|6    7|8|   9|10|11 
    
    Timestamp  machine   PID   Increment
    

    ObjectId 的前四个字节是以秒为单位的时间戳。这提供了几个有用的属性:时间戳与接下来的五个字节组合时,提供了以秒为粒度的唯一性。因为时间戳排在第一位,这意味着 ObjectIds 将按大致插入顺序排序(这不是强保证)。 在这四个字节中存在每个文档创建时间的隐含时间戳。

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

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

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

    【讨论】:

    • uuid 不会提供更多的独特性吗?使用这种算法,生成重复的 id 似乎并非不可能……“机器”-id 是从哪里来的?
    • 我在答案中写了 machineId 是主机名的哈希值,检查一下 uuid 与 objectId 的比较:stackoverflow.com/questions/22606364/…a
    猜你喜欢
    • 1970-01-01
    • 2013-08-28
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多