解決雜湊衝突的幾種方法

2021-10-02 05:40:38 字數 1120 閱讀 2436

雜湊演算法 的目的就是將一串很大的資料根據一定的規則轉換為較小的資料。

把任意長度的二進位制值串對映為固定長度的二進位制值串,這個對映的規則就是雜湊演算法,而通過原始資料對映之後得到的二進位制值串就是雜湊值。

在這個轉換過程中,總會出現兩個不同的資料在經過雜湊演算法的計算後生成了相同的雜湊值。這就是雜湊衝突。

雜湊衝突帶來的影響:

在雜湊表中,兩個不同資料的雜湊值相同,那麼不論這兩個資料中任意乙個先存放到指定位置之後,第二個資料都沒有地方可以存放了。所以設計雜湊演算法的時候一定要注意雜湊衝突問題!

雜湊演算法滿足的幾點要求:

從雜湊值不能反向推導出原始資料(所以雜湊演算法也叫單向雜湊演算法);

對輸入資料非常敏感,哪怕原始資料只修改了乙個 bit,最後得到的雜湊值也大不相同;

雜湊衝突的概率要很小,對於不同的原始資料,雜湊值相同的概率非常小;

雜湊演算法的執行效率要盡量高效,針對較長的文字,也能快速地計算出雜湊值

1. 開放位址法

h0,h1,h2,...,hn        1  <= n <= m - 1 其中m為表的大小

h0 = h(key) hi = (h(key)+ di)% m i=1,2,...n

形象地一句話來說,就是根據增量di不斷地往後找可以存放的下標。

增量di可以有下面三種取值:

開放定製法有很明顯的缺點

元素不能刪除

當雜湊表中元素越來越滿時,效率明顯下降

2. 二次雜湊法

若通過一次雜湊演算法計算出來的結果相同,那麼久在原基礎上再用另外的雜湊函式進行計算,直到不再產生相同的雜湊值為止。需要設計不同的雜湊演算法,類似於開放位址法;

3. 鏈位址法

每個下標中存的都是乙個鍊錶,相同雜湊值的key直接往下標中的鍊錶後面插入就行了

鏈位址法也是目前最常用的一種方法,尤其是當今的電腦效能較好時候。

但是也存在一定的缺陷:

解決雜湊衝突的幾種方法

雖然我們不希望發生衝突,但實際上發生衝突的可能性仍是存在的。當關鍵字值域遠大於雜湊表的長度,而且事先並不知道關鍵字的具體取值時。衝突就難免會發 生。另外,當關鍵字的實際取值大於雜湊表的長度時,而且表中已裝滿了記錄,如果插入乙個新記錄,不僅發生衝突,而且還會發生溢位。因此,處理衝突和溢位是 雜湊技術中...

解決Hash衝突的幾種方法

雖然我們不希望發生衝突,但實際上發生衝突的可能性仍是存在的。當關鍵字值域遠大於雜湊表的長度,而且事先並不知道關鍵字的具體取值時 衝突就難免會發 生。另外,當關鍵字的實際取值大於雜湊表的長度時,而且表中已裝滿了記錄,如果插入乙個新記錄,不僅發生衝突,而且還會發生溢位 因此,處理衝突和溢位是 雜湊技術中...

解決雜湊衝突的三種方法

上篇博文我們舉的例子,hashmap,hashset其實都是採用的拉鍊法來解決雜湊衝突的,就是在每個位桶實現的時候,我們採用鍊錶 jdk1.8之後採用鍊錶 紅黑樹 的資料結構來去訪問發生雜湊衝突的輸入域的關鍵字 也就是被雜湊函式對映到同乙個位桶上的關鍵字 首先來看使用拉鍊法解決雜湊衝突的幾個操作 插...