常用字串雜湊函式有bkdrhash,aphash,djbhash,jshash,rshash,sdbmhash,pjwhash,elfhash等等。
c++**實現:
#include #define m 249997
#define m1 1000003
#define m2 10000019
//大素數
using namespace std;
// rs hash function
unsigned int rshash(char*str)
return(hash % m2); }
// js hash function
unsigned int jshash(char*str)
return(hash % m2); }
// p. j. weinberger hash function
unsigned int pjwhash(char*str)
} return(hash % m2); }
// elf hash function
unsigned int elfhash(char*str)
} return(hash % m2); }
// bkdr hash function
unsigned int bkdrhash(char*str)
return(hash % m2); }
// sdbm hash function
unsigned int sdbmhash(char*str)
return(hash % m2); }
// djb hash function
unsigned int djbhash(char*str)
return(hash % m2); }
// ap hash function
unsigned int aphash(char*str)
else
} return(hash % m2);
} int main()
return (hash & 0x7fffffff) % buckets;
}int main(void)
; // 雜湊表每個位址的對映次數
// 0位址的對映次數用count[0]表示
int count[buckets] = ;
int i;
int size = sizeof(keywords) / sizeof(keywords[0]);
for (i = 0; i < size; i++)
for (i = 0; i < size; i++)
return 0;
}
對於以上幾種雜湊函式,對其進行了乙個小小的評測。
hash函式
資料1資料2
資料3資料4
資料1得分
資料2得分
資料3得分
資料4得分
平均分bkdrhash20
4774
48196.55
10090.95
82.05
92.64
aphash23
4754
49396.55
88.46
10051.28
86.28
djbhash22
4975
47496.55
92.31
0100
83.43
jshash14
4761
506100
84.62
96.83
17.95
81.94
rshash10
4861
505100
10051.58
20.51
75.96
sdbmhash32
4849
50493.1
92.31
57.01
23.08
72.41
pjwhash
3026
4878
5130
043.89
021.95
elfhash
3026
4878
5130
043.89
021.95
其中資料1為100000個字母和數字組成的隨機串雜湊衝突個數。資料2為100000個有意義的英文句子雜湊衝突個數。資料3為資料1的雜湊值與1000003(大素數)求模後儲存到線性表中衝突的個數。資料4為資料1的雜湊值與10000019(更大素數)求模後儲存到線性表中衝突的個數。
經過比較,得出以上平均得分。平均數為平方平均數。可以發現,bkdrhash無論是在實際效果還是編碼實現中,效果都是最突出的。aphash也是較為優秀的演算法。djbhash,jshash,rshash與sdbmhash各有千秋。pjwhash與elfhash效果最差,但得分相似,其演算法本質是相似的。
什麼是雜湊演算法 雜湊函式 雜湊函式?
舉個例子,比如這裡有一萬首歌,給你一首新的歌x,要求你確認這首歌是否在那一萬首歌之內。無疑,將一萬首歌乙個乙個比對非常慢。但如果存在一種方式,能將一萬首歌的每首資料濃縮到乙個數字 稱為雜湊碼 中,於是得到一萬個數字,那麼用同樣的演算法計算新的歌x的編碼,看看歌x的編碼是否在之前那一萬個數字中,就能知...
雜湊函式(雜湊函式,Hash Function)
說明 雜湊的概念屬於查詢,它不以關鍵字的比較為基本操作,採用直接定址技術。在理想情況下,查詢的期望時間為o 1 簡單的說,hash函式就是把任意長的輸入字串變化成固定長的輸出字串的一種函式。輸出字串的長度稱為hash函式的位數。下圖 於維基百科 雜湊函式把訊息或資料壓縮成摘要,使得資料量變小,將資料...
演算法函式 左神演算法基礎 雜湊函式和雜湊表
筆者在讀研剛開始的時候,偶爾看面經,有這樣乙個問題 只用2gb內存在20億個整數中找到出現次數最多的數,當時的我一臉懵逼,怎麼去思考,20億個數?what the 但是,看完今天的文章,你或許就會覺得原來也不過如此啊!其核心就是雜湊函式和雜湊表的應用!雜湊函式又稱為雜湊函式,就是把任意長度的輸入 又...