聊天室原始碼開發中應對雜湊衝突的解決方案

雲豹科技程式設計師發表於2021-11-23

雜湊衝突的解決辦法:

  • 開放地址法
  • 拉鍊法(鏈地址法)
  • 再雜湊法

一、開放地址法

原理是當聊天室原始碼發生hash衝突時,會以當前地址為基準,然後根據定址方法(探查定址),去尋找下一次地址。若聊天室原始碼依舊發生衝突,則繼續定址,直到找到一個空的位置為止。
通用的雜湊函式形式為:
Hi=(H(key)+di)% m (i=1,2,…,n)
其中H(key)為雜湊函式,m 為表長,di稱為增量序列。增量序列的取值方式不同,相應的再雜湊方式也不同。

定址方法

1. 線性探查

順序查詢表的下一個單元,直到找到一個空單元或查遍全表。
即當聊天室原始碼的hash值為3衝突時(假設此時hash表長度為11),利用線性探查的過程為:
H1 = (3+1)%11 = 4,此時若4依舊衝突,則再hash,即
H2 = (3+2)%11 = 5 … 通過這種線性增長增量系列,直到找到空的位置為止。

2. 二次探查

這種方法的特點是,當聊天室原始碼出現雜湊衝突時,在表的左右進行跳躍探測,比較靈活。
此時di = 1^2, -1^2, 2^2, -2^2 …
假設當hash值為3衝突時(假設此時hash表長度為11),利用二次探查的過程為:
H1 = (3+1^2)%11 = 4,此時若4依舊衝突,則再hash,即
H2 = (3+(-1)^2)%11 = 2 …
通過該方法直到找到空位置為止。

3. 偽隨機探測

這種方法即是產生一些隨機系列值,並給定隨機數作為起點。
假設當聊天室原始碼的hash值為3衝突時(假設此時hash表長度為11),利用偽隨機探測的過程為:
假設產生的隨機系列為2,5,9 …,則
H1 = (3+2)%11 = 5
H2 = (3+5)%11 = 8
通過該方法直到找到空位置為止。

二、拉鍊法

拉鍊法應用於hashMap和hashSet中,當聊天室原始碼產生hash衝突時,則會以該hash衝突的位置構建一個單連結串列(即將所有雜湊地址為i的元素構成一個稱為同義詞鏈的單連結串列),並將單連結串列的頭指標儲存在聊天室原始碼雜湊表的第i個位置中。
鏈地址法適用於經常進行插入和刪除的情況。

三、再雜湊法

指聊天室原始碼使用雜湊函式計算雜湊位置時,當不同雜湊出現同一位置時就再次使用雜湊,直到不衝突。

本文轉載自網路,轉載僅為分享乾貨知識,如有侵權歡迎聯絡雲豹科技進行刪除處理
原文連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69996194/viewspace-2843685/,如需轉載,請註明出處,否則將追究法律責任。

相關文章