基本概念
所謂完美雜湊函式。就是指沒有衝突的雜湊函式。即對隨意的 key1 != key2 有h(key1) != h(key2)。
設定義域為x,值域為y, n=|x|,m=|y|。那麼肯定有m>=n,假設對於不同的key1,key2屬於x,有h(key1)!=h(key2),那麼稱h為完美雜湊函式,當m=n時,h稱為最小完美雜湊函式(這個時候就是一一映**)。
在處理大規模字串資料時。常常要為每乙個字串分配乙個整數id。這就須要乙個字串的雜湊函式。怎麼樣找到乙個完美的字串hash函式呢?
有一些經常使用的字串hash函式。
像bkdrhash,aphash。djbhash。jshash,rshash。sdbmhash,pjwhash。elfhash等等。都是比較經典的。
經常使用的字串hash函式還有elfhash,aphash等等,都是十分簡單有效的方法。
這些函式使用位運算使得每個字元都對最後的函式值產生影響。另外還有以md5和sha1為代表的雜湊函式。這些函式差點兒不可能找到碰撞。
經常使用字串雜湊函式有 bkdrhash。aphash。djbhash,jshash,rshash,sdbmhash,pjwhash,elfhash等等。對於以上幾種雜湊函式。我對其進行了乙個小小的評測。
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效果最差,但得分相似,其演算法本質是相似的。
c語言實現的hash()如下:
unsigned int sdbmhash(char *str)
return (hash & 0x7fffffff);}
// rs hash function
unsigned int rshash(char *str)
return (hash & 0x7fffffff);}
// js hash function
unsigned int jshash(char *str)
return (hash & 0x7fffffff);}
// p. j. weinberger hash function
unsigned int pjwhash(char *str)
}return (hash & 0x7fffffff);}
// elf hash function
unsigned int elfhash(char *str)
}return (hash & 0x7fffffff);}
// bkdr hash function
unsigned int bkdrhash(char *str)
return (hash & 0x7fffffff);}
// djb hash function
unsigned int djbhash(char *str)
return (hash & 0x7fffffff);}
// ap hash function
unsigned int aphash(char *str)
else
}return (hash & 0x7fffffff);
}
或者使用模板的方式(c++)://6種字串雜湊演算法
templatesize_t bkdrhash(const t * str)
return hash;
}templatesize_t sdbmhash(const t *str)
return hash;
}templatesize_t rshash(const t *str)
return hash;
}templatesize_t aphash(const t *str)
else
}return hash;
}templatesize_t jshash(const t *str)
return hash;
}templatesize_t dekhash(const t* str)
return hash;
}
雜湊表(雜湊表)及其實現
雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。例如 給定表m,存在函式f key 對任意給定的關鍵字值key,代入函...
常用雜湊函式的比較及其C語言實現
基本概念 所謂完美雜湊函式,就是指沒有衝突的雜湊函式,即對任意的 key1 key2 有h key1 h key2 設定義域為x,值域為y,n x m y 那麼肯定有m n,如果對於不同的key1,key2屬於x,有h key1 h key2 那麼稱h為完美雜湊函式,當m n時,h稱為最小完美雜湊函...
strtok函式及其實現
標頭檔案 include 定義函式 char strtok char s,const char delim 函式說明 strtok 用來將字串分割成乙個個片段。引數s 指向欲分割的字串,引數delim 則為分割字串,當 strtok 在引數s 的字串中發現到引數delim 的分割字元時則 會將該字元...