return h % M;
爲了不hash碰撞,咱們將M每每設置成質數,避免因爲鍵在某一範圍比較集中所致大量的hash碰撞
如:當h值集中100-120,可是M取了100,這樣hash所得值集中在0-20。java
默認值M爲16code
return h & (M - 1);
等效取餘
M取值每每爲2的冪次方,而M-1會產生低位全爲1的狀況,使得&運算結果小於Mhash
運算效率提升
%運算的效率低於位運算效率
碰撞問題
產生大量碰撞的狀況:
二進制來看,參數key中M個低位常出現同一值。如M爲4,而M-1其二進制爲:1111
參數key中的低位出現同一值,如:00001110,00101110,01001110
但由此而言,產生hash碰撞的數據相差之間較大。hashmap
2的冪次的緣由
保證小於M的每一個值均可以取到map