# 解释
- 提高哈希计算的效率
- 减少哈希冲突
# 为什么可以提高计算效率?
KEY的位置 = hash(KEY)%Length
由于&运算速度比%要快,公式优化为 KEY的位置 = hash(KEY)&(Length -1)
举例:
假设数组长度Length : 2 ^ 14 = 16384 , KEY = "zZ1!"
得出 hash(KEY ) = 115398910
A:
115398910 &(16384 -1)
=> 110111000001101100011111110 & 11111111111111
=> 11011100000110
==> 6398
B:
115398910 % 16384 = 6398
=> 7043 余 6398
==> 6398
在A方案中,由于Length的长度是2的倍数,元素哈希值不变,B方案%计算会因为Length的变化导致算出来的hash桶的位置不断的变化,数据漂移影响性能
# 为什么可以减少冲突?
当Length为偶数时,(Length-1)为技术,二进制最后一个为1,这样便保证了hash(KEY)&(Length -1)二进制结果的最后一位可能为0,也可能为1,运算后的结果可能为奇数,也可能是偶数,保证了散列的均匀性
当Length为奇数时,可推理出hash(KEY)&(Length -1)二进制结果的最后一位一定是0,其结果只能为偶数,hash值只会被散列到数组的偶数下标上,浪费了近一半的空间
因此length 取 2 的整数次幂,是为了使不同 hash 值发生碰撞的概率较小,这样就能使元素在哈希表中均匀地散列
