雜湊函式(hash function)又名雜湊函式,是電腦科學中乙個重要的課題。什麼是雜湊函式呢?其實,這個概念並沒有乙個嚴格的定義。一般說來,雜湊函式滿足以下的條件:
1、對輸入值運算,得到乙個固定長度的摘要(hash value);
2、不同的輸入值可能對應同樣的輸出值;
不過,僅僅滿足上面這兩條的函式,作為雜湊函式,還有不足的地方。我們還希望雜湊函式滿足下面幾點:
1、雜湊函式的輸出值盡量接近均勻分布;
2、x的微小變化可以使f(x)發生非常大的變化,即所謂「雪崩效應」
;上面兩點用數學語言表示,就是:
1、輸出值y的分布函式f(y)=y/m, m為雜湊函式的最大值。或記為y~u[0, m]
2、|df(x)/dx| >> 1;
在hash表的建立時,會發生hash值衝突的情況。實際上,如果記錄hash值的範圍多於hash表的條數,根據抽屜原理,一定會發生衝突。對於衝突的處理,我們一般有這幾種方法:
對hash表中每個hash值建立乙個衝突表,即將衝突的幾個記錄以表的形式儲存在其中;
改變規則重新計算一次hash值;
建立乙個公用的區域存放衝突的表項;
在工程上,考慮到實現演算法的複雜度,方法1用得是最多的。對於方法1,又有兩種不同的實現,一種方法是對每個hash值,建立乙個hash桶(bucket),桶的容量是固定的,也就是只能處理固定次數的衝突,如1048576個hash桶,每個桶中有4個表項(entry),總計4m個表項。另一種方法是,不限制hash桶的容量,以鍊錶形式將衝突的記錄掛接在乙個hash桶中。
這兩種實現各有什麼利弊呢?首先,讓我們看看第一種實現:
在這種情況下,由於hash桶容量的限制,所以,有可能發生hash表填不滿的情況,也就是,雖然hash表裡面還有空位,但是新建的表項由於衝突過多,而不能裝入hash表中。不過,這樣的實現也有其好處,就是查表的最大開銷是可以確定的,因為最多處理的衝突數是確定的,所以演算法的時間複雜度為o(1)+o(m),其中m為hash桶容量。
而另一種實現,由於hash桶的容量是無限的,因此,只要沒有超出hash表的最大容量,就能夠容納新建的表項。但是,一旦發生了hash衝突嚴重的情況,就會造成hash桶的鍊錶過長,大大降低查詢效率。在最壞的情況下,時間複雜度退化為o(n),其中n為hash表的總容量。當然,這種情況的概率小之又小,幾乎是可以忽略的。
hash表的乙個應用例子,是在閘道器(gateway)中。以網路防火牆為例,它是根據源ip,目的ip,源埠,目的埠,協議號構成的五元組來標識一條網路資料流的,並且根據五元組來建立會話表項(session entry)。為了查詢便捷,一般都使用hash表來實現這個會話表,以提高**的效率。事實上,對於大量表項的查詢,逐項查詢是不允許的,一般都使用hash表來實現。
雜湊表相關問題
1 雜湊的概念 元素的儲存位置與它的關鍵碼一一對映,在查詢元素的時候不用進行比較,可以直接在表中檢索出元素的值,所以查詢的時間複雜度是o 1 2 雜湊衝突 不同關鍵字通過相同雜湊數計算出相同的雜湊位址 3 產生雜湊衝突的原因 設計的雜湊函式不夠合理 常用的雜湊函式 直接的定製法,除留餘數法 4 解決...
表相關操作
使用t sql建立表 use database name 指向操作的資料庫 go 批處理的標記 create table table name 新建表 column name 資料型別 identity 1000,1 not null,最後一列不需要逗號 go說明 資料型別 int varchar ...
8 資料結構高階八雜湊表相關概念
8.資料結構高階八雜湊表相關概念 作家當然必須掙錢才能生活,寫作,但是他決不應該為了掙錢而生活,寫作。馬克思 前些筆記學習了二叉樹相關。現在我們來看下雜湊表。這篇先來看下雜湊表的相關概念 雜湊表 hashtable 也叫雜湊表,是根據關鍵碼值 key value 而直接進行訪問的資料結構。它通過把關...