1. 程式人生 > >Hash函式及其衝突解決

Hash函式及其衝突解決

@Author  : Spinach | GHB
@Link    : http://blog.csdn.net/bocai8058

常用的hash函式

直接取餘法

取關鍵字被某個不大於散列表表長m的數p除後所得的餘數為雜湊地址。

H(key) = key MOD p, p<=m

maxM一般是不太接近 2^t 的一個質數。

乘法取整法

f(x) = trunc((x/maxX)*maxlongit) mod maxM

主要用於實數。

平方取中法

f(x) = (x*x div 1000 ) mod 1000000)

平方後取中間的,每位包含資訊比較多。

直接定址法

H(key) = key 或 H(key) = a·key + b,其中a和b為常數

取關鍵字或關鍵字的某個線性函式值為雜湊地址。

數字分析法

分析一組資料,比如一組員工的出生年月日,這時我們發現出生年月日的前幾位數字大體相同,這樣的話,出現衝突的機率就會很大,但是我們發現年月日的後幾位表示月份和具體日期的數字差別很大,如果用後面的數字來構成雜湊地址,則衝突的機率會明顯降低。因此數字分析法就是找出數字的規律,儘可能利用這些資料來構造衝突機率較低的雜湊地址。

摺疊法

將關鍵字分割成位數相同的幾部分,最後一部分位數可以不同,然後取這幾部分的疊加和(去除進位)作為雜湊地址。

隨機數法

選擇一隨機函式,取關鍵字的隨機值作為雜湊地址,通常用於關鍵字長度不同的場合。

處理衝突的方法

hash衝突在所難免,解決衝突是一個複雜問題。衝突主要取決於:

  • 與雜湊函式有關,一個好的雜湊函式的值應儘可能平均分佈。
  • 與解決衝突的雜湊衝突函式有關。
  • 與負載因子的大小。太大不一定就好,而且浪費空間嚴重,負載因子和雜湊函式是聯動的。

解決衝突的辦法:

  1. 開放定址法:線性探查法、平方探查法、偽隨機序列法、雙雜湊函式法。
  2. 拉鍊法:把所有同義詞,即hash值相同的記錄,用單鏈表連線起來。

開放定址法

開放定址法:線性探查法、平方探查法、偽隨機序列法、雙雜湊函式法

開放定址法;Hi=(H(key) + di) MOD m,i=1,2,…,k(k<=m-1),其中H(key)為雜湊函式,m為散列表長,di為增量序列

線性探查法

di=1,2,3,…,m-1,稱線性探測再雜湊;

平方探查法

di=1^2, (-1)^2, 2^2, (-2)^2, (3)^2, …, ±(k)^2, (k<=m/2) 稱二次探測再雜湊;

偽隨機序列法

di=偽隨機數序列,稱偽隨機探測再雜湊。

雙雜湊函式法(再雜湊法)

Hi=RHi(key),i=1,2,…,k RHi均是不同的雜湊函式,即在同義詞產生地址衝突時計算另一個雜湊函式地址,直到衝突不再發生,這種方法不易產生“聚集”,但增加了計算時間。

鏈地址法(拉鍊法)

將所有雜湊地址相同的記錄都連結在同一表中。

eg: hash=1 --> 1 --> 3 --> 5

建立一個公共溢位區

把衝突的都放在另一個地方,不在表裡面。