Hash 在伏地魔中,为什么散列环只能延伸到2^31-1?

Hash 在伏地魔中,为什么散列环只能延伸到2^31-1?,hash,voldemort,consistent-hashing,Hash,Voldemort,Consistent Hashing,在伏地魔项目设计页面上: 声明散列环覆盖区间[0,2^31-1] 现在,区间[0,2^31-1]表示2^31个总数,最大的数字2^31-1仅为31位,全部设置为1。(为了说服自己,考虑2 ^ 3-1,2 ^ 3=8,并且是0x1000。2 ^ 3-1=7,并且是0x111)。 因此,如果使用普通32位地址字来存储该值,则有1位空闲 因此,为什么2^31-1是上限?这个额外的位用于某种系统记账吗 (例如,1个额外位将为安全添加两个有效哈希地址提供空间,而不会溢出) 最后,这个选择是伏地魔特有的,

在伏地魔项目设计页面上:

声明散列环覆盖区间[0,2^31-1]

现在,区间[0,2^31-1]表示2^31个总数,最大的数字2^31-1仅为31位,全部设置为1。(为了说服自己,考虑2 ^ 3-1,2 ^ 3=8,并且是0x1000。2 ^ 3-1=7,并且是0x111)。

因此,如果使用普通32位地址字来存储该值,则有1位空闲

因此,为什么2^31-1是上限?这个额外的位用于某种系统记账吗

(例如,1个额外位将为安全添加两个有效哈希地址提供空间,而不会溢出)


最后,这个选择是伏地魔特有的,还是在其他一致的散列方案中看到的?

我认为你只有1位空闲空间,而不是2位空闲空间。-1解释了它以数字“0”而不是1开头的事实(相同的原因是循环计数从0到计数-1)。我猜他们使用2^31而不是2^32的原因是他们使用的是有符号整数,所以最后一位是有符号位,所以不可用

编辑: 从您链接的页面:

为了可视化一致性散列方法,我们可以看到 整数散列值作为以0开头并围绕到的环 2^31-1


它指定了一个整数,因此除非您想要负散列值,否则您只能使用2^31而不是2^32。

回答问题有点晚,只需4年:)


原因是伏地魔是用Java编写的,Java没有无符号整数。2^31对于分区来说已经非常高了。一般来说,我们建议只使用几千个分区运行。

感谢您及时发现我的错误!我做了一个简单的例子来防止再次犯那个错误。我还添加了一个关于添加的猜想。在某些算术运算中,加法和求反都可能有用。而且,如果已经接受的答案没有说明,则不添加任何内容。@BlakesSeven我只添加了几千个分区的建议☺