什麼是雜湊演算法 雜湊函式 雜湊函式?

2021-12-30 13:04:07 字數 1426 閱讀 2684

舉個例子,比如這裡有一萬首歌,給你一首新的歌x,要求你確認這首歌是否在那一萬首歌之內。

無疑,將一萬首歌乙個乙個比對非常慢。但如果存在一種方式,能將一萬首歌的每首資料濃縮到乙個數字(稱為雜湊碼)中,於是得到一萬個數字,那麼用同樣的演算法計算新的歌x的編碼,看看歌x的編碼是否在之前那一萬個數字中,就能知道歌x是否在那一萬首歌中。

作為例子,如果要你組織那一萬首歌,乙個簡單的雜湊演算法就是讓歌曲所佔硬碟的位元組數作為雜湊碼。這樣的話,你可以讓一萬首歌「按照大小排序」,然後遇到一首新的歌,只要看看新的歌的位元組數是否和已有的一萬首歌中的某一首的位元組數相同,就知道新的歌是否在那一萬首歌之內了。

當然這個簡單的雜湊演算法很容易出現兩者同樣大小的歌曲,這就是傳送了碰撞。而好的雜湊演算法發生碰撞的機率非常小。

解決碰撞是乙個複雜問題。碰撞主要取決於:

(1)雜湊函式,乙個好的雜湊函式的值應盡可能平均分布。

(2)處理碰撞方法。

(3)負載因子的大小。太大不一定就好,並且浪費空間嚴重,負載因子和雜湊函式是聯動的。

解決碰撞的辦法:

(1)線性探查法:衝突後,線性向前試探,找到近期的乙個空位置。缺點是會出現堆積現象。訪問時,可能不是同義詞的詞也位於探查序列,影響效率。

(2)雙雜湊函式法:在位置d衝突後,再次使用還有乙個雜湊函式產生乙個與雜湊表桶容量m互質的數c,依次試探(d+n*c)%m,使探查序列跳躍式分布。

經常使用的構造雜湊函式的方法

雜湊函式能使對乙個資料序列的訪問過程更加迅速有效,通過雜湊函式,資料元素將被更快地定位:

1. 直接定址法:取keyword或keyword的某個線性函式值為雜湊位址。即h(key)=key或h(key) = a?key + b,當中a和b為常數(這樣的雜湊函式叫做自身函式)

2. 數字分析法:分析一組資料,比方一組員工的出生年月日,這時我們發現出生年月日的前幾位數字大體同樣,這種話,出現衝突的機率就會非常大,可是我們發現年月日的後幾位表示月份和詳細日期的數字區別非常大,假設用後面的數字來構成雜湊位址,則衝突的機率會明顯減少。因此數字分析法就是找出數字的規律,盡可能利用這些資料來構造衝突機率較低的雜湊位址。

3. 平方取中法:取keyword平方後的中間幾位作為雜湊位址。

4. 摺疊法:將keyword切割成位數同樣的幾部分,最後一部分位數能夠不同,然後取這幾部分的疊加和(去除進製)作為雜湊位址。

5. 隨機數法:選擇一隨機函式,取keyword的隨機值作為雜湊位址,通經常使用於keyword長度不同的場合。

6. 除留餘數法:取keyword被某個不大於雜湊表表長m的數p除后所得的餘數為雜湊位址。即 h(key) = key mod p, p<=m。不僅能夠對keyword直接取模,也可在摺疊、平方取中等運算之後取模。對p的選擇非常重要,一般取素數或m,若p選的不好,easy產生同義詞。

雜湊演算法的應用

從專業的角度來說,雜湊演算法是用來解決資料和資料之間對應關係的一種演算法。它的初衷是用來加速資料訪問。

雜湊函式 雜湊函式 演算法

常用字串雜湊函式有bkdrhash,aphash,djbhash,jshash,rshash,sdbmhash,pjwhash,elfhash等等。c 實現 include define m 249997 define m1 1000003 define m2 10000019 大素數 using ...

雜湊函式(雜湊函式,Hash Function)

說明 雜湊的概念屬於查詢,它不以關鍵字的比較為基本操作,採用直接定址技術。在理想情況下,查詢的期望時間為o 1 簡單的說,hash函式就是把任意長的輸入字串變化成固定長的輸出字串的一種函式。輸出字串的長度稱為hash函式的位數。下圖 於維基百科 雜湊函式把訊息或資料壓縮成摘要,使得資料量變小,將資料...

雜湊 雜湊函式 衝突處理

例 如果我們現在要統計的是80後出生年份的人口數,那麼我們對出生年份這個關鍵字可以用年份減去1980來作為位址。此時f key key 1980。這樣的雜湊函式優點就是簡單 均勻,也不會產生衝突,但問題是這需要事先知道關鍵字的分布情況,適合查詢表較小且連續的情況。由於這樣的限制,在現實應用中,直接定...