雜湊碰撞

橘子味芬达水發表於2024-10-22

問:兩個字串hashcode相同equals一定相同嗎?equals相同hashcode一定相同嗎?

答:equals相同hashcode一定相同,hashcode因為雜湊碰撞所以equals不一定相同。

Hash如何存資料
hash表的本質其實就是陣列,hash表中通常存放的是鍵值對Entry。

如下圖:

這裡的學號是個key,雜湊表就是根據key值來透過雜湊函式計算得到一個值,這個值就是下標值,用來確定這個Entry要存放在雜湊表中哪個位置。


Hash碰撞
hash碰撞指的是,兩個不同的值(比如張三、李四的學號)經過hash計算後,得到的hash值相同,後來的李四要放到原來的張三的位置,但是陣列的位置已經被張三佔了,導致衝突。

解決方法
hash碰撞的解決方式是開放定址法和拉鍊法

開放定址法指的是,當前陣列位置1被佔用了,就放到下一個位置2上去,如果2也被佔用了,就繼續往下找,直到找到空位置。

拉鍊法採用的是連結串列的方式,這個時候位置1就不單單存放的是Entry了,此時的Entry還要額外儲存一個next指標,指向陣列外的另一個位置,將李四安排在這裡,張三那個Entry中的next指標就指向李四的這個位置,也就是儲存的這個位置的記憶體地址。如果還有衝突,就把又衝突的那個Entry放到一個新位置上,然後李四的Entry指向它,這樣就形成一個連結串列。

相關文章