散列切分键在mongodb中如何工作?

散列切分键在mongodb中如何工作?,mongodb,hash,Mongodb,Hash,我想知道mongodb中散列切分键的内部结构是什么。例如,如果是时间戳,mongodb选择散列我的字段的常量是什么? 我猜密钥将是时间戳%N;什么是N? 如果这是设计,我猜N不能随时间而改变。如果N太小,我如何确保如果我有大量数据,那么在1个碎片中不会有太多的冲突 感谢散列键使用文档中的数据,并使用标准散列函数(MD5)为文档生成散列值。例如,假设您的索引位于{name:'hashed'}上,并且您有以下文档: {name: 'John', height: 73} {name: 'Zardosh

我想知道mongodb中散列切分键的内部结构是什么。例如,如果是时间戳,mongodb选择散列我的字段的常量是什么?
我猜密钥将是时间戳%N;什么是N?
如果这是设计,我猜N不能随时间而改变。如果N太小,我如何确保如果我有大量数据,那么在1个碎片中不会有太多的冲突
感谢

散列键使用文档中的数据,并使用标准散列函数(MD5)为文档生成散列值。例如,假设您的索引位于
{name:'hashed'}
上,并且您有以下文档:

{name: 'John', height: 73}
{name: 'Zardosht', height: 68}
MongoDB将通过MD5哈希函数运行
'John'
'Zardosht'
,并获得随机的字节序列。然后,它将使用这些字节序列作为索引中使用的实际B树键。当您想要查询
{name:'John'}
时,它会再次执行MD5哈希,获取与之前相同的字节序列,然后实际对该值执行索引查找

您可以使用mongo shell,亲自查看这些值:

 % mongodb-linux-x86_64-2.2.5/bin/mongo                 
MongoDB shell version: 2.2.5
connecting to: test
> db.runCommand({_hashBSONElement: {name: "John"}})
{
    "key" : {
        "name" : "John"
    },
    "seed" : 0,
    "out" : NumberLong("5553133884637223031"),
    "ok" : 1
}
> db.runCommand({_hashBSONElement: {name: "Zardosht"}})
{
    "key" : {
        "name" : "Zardosht"
    },
    "seed" : 0,
    "out" : NumberLong("8641066842148283865"),
    "ok" : 1
}

请注意,在我描述的任何内容中都没有
N
,因此您不必担心这样的限制。

它将md5键,并使用md5的一部分存储在索引中,不记得确切的内容,源代码会说