散列的概念屬於查找,它不以關鍵字的比較爲基本操做,採用直接尋址技術。在理想狀況下,查找的指望時間爲O(1)。算法
hash函數就是把任意長的輸入字符串變化成固定長的輸出字符串的一種函數。輸出字符串的長度稱爲hash函數的位數。數據結構
散列(Hashing)經過散列函數將要檢索的項與索引(散列,散列值)關聯起來,生成一種便於搜索的數據結構(散列表)。dom
目前應用最爲普遍的hash函數是SHA-1和MD5,大可能是128位和更長。hash函數在現實生活中應用十分普遍。不少下載網站都提供下載文件的MD5碼校驗,能夠用來判別文件是否完整,在一些BitTorrent下載中,軟件將經過計算MD5檢驗下載到的文件片斷的完整性,etc。函數
哈希衝突是不可避免的,由於鍵的數目老是比索引的數目多,無論是多麼高明的算法都不可能解決這個問題。就算鍵的數目比索引的數目少,必有一個輸出串對應多個輸入串,衝突仍是會發生。網站
hash函數的構造準則:簡單、均勻。索引
(1)散列函數的計算簡單,快速;字符串
(2)散列函數能將關鍵字集合K均勻地分佈在地址集{0,1,…,m-1}上,使衝突最小。hash
取關鍵字或關鍵字的某個線性函數值爲哈希地址:H(key) = key 或 H(key) = a·key + b
其中a和b爲常數,這種哈希函數叫作自身函數。it
注意:因爲直接定址所得地址集合和關鍵字集合的大小相同。所以,對於不一樣的關鍵字不會發生衝突。但實際中能使用這種哈希函數的狀況不多。隨機數
首先用關鍵字key乘上某個常數A(0 < A < 1),並抽取出key.A的小數部分;而後用m乘以該小數後取整。
注意:該方法最大的優勢是m的選取比除餘法要求更低。好比,徹底可選擇它是2的整數次冪。雖然該方法對任何A的值都適用,但對某些值效果會更好。Knuth建議選取 0.61803……。
取關鍵字平方後的中間幾位爲哈希地址。
經過平方擴大差異,另外中間幾位與乘數的每一位相關,由此產生的散列地址較爲均勻。這是一種較經常使用的構造哈希函數的方法。
將一組關鍵字(0100,0110,1010,1001,0111)
平方後得(0010000,0012100,1020100,1002001,0012321)
若取表長爲1000,則可取中間的三位數做爲散列地址集:(100,121,201,020,123)。
取關鍵字被數p除後所得餘數爲哈希地址:H(key) = key MOD p (p ≤ m)。
注意:這是一種最簡單,也最經常使用的構造哈希函數的方法。它不只能夠對關鍵字直接取模(MOD),也可在折迭、平方取中等運算以後取模。值得注意的是,在使用除留餘數法時,對p的選擇很重要。通常狀況下能夠選p爲質數或不包含小於20的質因素的合數。
選擇一個隨機函數,取關鍵字的隨機函數值爲它的哈希地址,即 H(key) = random (key),其中random爲隨機函數。一般,當關鍵字長度不等時採用此法構造哈希函數較恰當。