java – 导致冲突的位模式的哪些属性?

我正在阅读Java的随机化哈希键here的方法
显然,我们的想法是确保较低位是“随机”以帮助分发,但我试图更多地理解这一点.
因此,如果我们有一个大小为10的表,那么数字0,10,20,30,40等都落在桶0中,数字1,11,21,31等落在桶1等中(使用模10).
因此,改变位模式,你可以使它们转到不同的桶,而不是所有去桶0.
但是我不清楚的是它是什么属性使得低阶位影响这一点,我们需要将它们随机化.
所以我们有:

0000 0000 (0)  
0000 1010 (10)  
0001 0100 (20) 
0001 1110 (30)  
0010 1000 (40) 

低阶位的规律性是什么使它们被放置在同一个插槽中?
也许我对以下内容感到困惑?我的理解是,低阶位中的一些规律性会导致冲突,我们会尝试随机化比特来进行补偿

最佳答案
一些散列函数在随机化低阶位方面做得非常糟糕.

一个经典案例是使用硬件地址作为对象引用的哈希值(C中的“指针”),否则这将是廉价获取对象id的唯一数字的合理方式.如果哈希表的桶数是素数,这将正常工作,但对于桶的数量始终为2的幂的哈希实现,所有哈希值可被8整除的事实意味着大多数桶都是空的.

这是一种极端的情况,但是任何时候要散列的数据都不是均匀分布的并且散列函数倾向于保留低阶位,你会在桶分配中发现一些偏差.

转载注明原文:java – 导致冲突的位模式的哪些属性? - 代码日志