jdk1.8 hash函數 (h = key.hashCode()) 與 (h >>> 16) 異或


jdk1.8 hash函數  (h = key.hashCode()) 與 (h >>> 16) 異或

jdk1.8確定map坐標的方式是tab[(n-1)&hash] n代表map的length,由於絕大多數情況下 map的length的值小於2^16 (25536),所以大部分情況下是hash的低16位與map的length進行與運算(&),如下例子:

例子1:map的length為8,key的hashcode假設為24421231那么下標計算就是

tab[(8-1)&24421231]

 1   000000000000000000000111
 2 
 3 &
 4 
 5   111101001010001101101111
 6 
 7   ----------------------------------------
 8 
 9   000000000000000000000111
10 
11   計算出map的坐標為7

上面是低三位進行運算,如果hash值的第三位更加隨機那么結果就更加隨機,那么如何讓低三位更加隨機 那么就是讓hashcode與hashcode的高16位進行異或運算

如果

  length=8時,下標運算結果取決於hashcode的低3位

  length=16時,下標運算結果取決於hashcode的低4位

  length=32時,下標運算結果取決於hashcode的低5位

  length=2^n時,下標運算結果取決於hashcode的低n位

由於和(length-1)進行運算,length的長度多數情況下小於2^16,始終是hashcode的低16位參與運算,甚至更低,要是讓高16位也參與運算那么下標就會更加散列.

& | 的運算結果會讓結果偏向於0和1,沒有更加均勻

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM