使用位运算优化对2的n次方取模
hash % 2^n == hash & (2^n - 1)
原理分析
2^n - 1
2^n:
二进制形式为1+n个0
2^n - 1:
二进制形式为n个1
hash % 2^n
例如我们对27取模2^3,先将13写成2进制形式:
27 =1 x 2^4 + 1 x 2^3
+
0 x 2^2 + 1 x 2^1 + 1 x 2^0
我将“x % y”理解为:
从x中不停的扣掉y值,直到剩下0或者剩下的值小于y。
对27来执行这个过程:
- 先将"1 x 2^4 + 1 x 2^3"这坨扣掉
- 剩下的0 x 2^2 + 1 x 2^1 + 1 x 2^0 < 2^3
观察身下的部分可以发现,27 % 2^3相当于 截取 27二进制的后3位。
一般的,hash % 2^n相当于 截取 hash二进制表示的后n位。
hash & (2^n - 1)
由前面分析可知,2^n - 1二进制为n个1,用它和hash进行&运算刚好可以截取后n位。所以:
hash % 2^n == hash & (2^n - 1)
位运算只需要一个时钟周期;而%运算需要几十个。所以使用位运算实现更快。
其他
n位2进制中有2^n个数。
重复排列公式
如果有 n 种位置,每个位置都有 k 种选择,且允许重复选择,那么:
能表达的编码数量 = k ^ n
均匀分布/不均匀分布
假设有n个桶:
- “均匀分布”指每个桶都有相同概率被选中
- “不均匀分布”指每个桶被选中的概率不同;甚至在概率不同的同时,有的桶被选中的概率为0%