常用的字串hash函式還有elfhash,aphash等等,都是十分簡單有效的方法。這些函式使用位運算使得每乙個字元都對最後的函式值產生影響。另外還有以
md5和sha1為代表的雜湊函式,這些函式幾乎不可能找到碰撞。
常用字串雜湊函式有bkdrhash,aphash,djbhash,jshash,rshash,sdbmhash,pjwhash,elfhash等等。對於以上幾種雜湊函式,我對其進行了乙個小小
的評測。
hash函式 資料1 資料2 資料3 資料4 1得分 2得分 3得分 4得分 平均分
bkdrhash 2 0 4774 481 96.55 100 90.95 82.05 92.64
aphash 2 3 4754 493 96.55 88.46 100 51.28 86.28
djbhash 2 2 4975 474 96.55 92.31 0 100 83.43
jshash 1 4 4761 506 100 84.62 96.83 17.95 81.94
rshash 1 0 4861 505 100 100 51.58 20.51 75.96
sdbmhash 3 2 4849 504 93.1 92.31 57.01 23.08 72.41
pjwhash 30 26 4878 513 0 0 43.89 0 21.95
elfhash 30 26 4878 513 0 0 43.89 0 21.95
其中資料1為100000個字母和數字組成的隨機串雜湊衝突個數。資料2為100000個有意義的英文句子雜湊衝突個數。資料3為資料1的雜湊值與1000003(大素數)
求模後儲存到線性表中衝突的個數。資料4為資料1的雜湊值與10000019(更大素數)求模後儲存到線性表中衝突的個數。
經過比較,得出以上平均得分。平均數為平方平均數。可以發現,bkdrhash無論是在實際效果還是編碼實現中,效果都是最突出的。aphash也是較為優秀的
演算法。djbhash,jshash,rshash與sdbmhash各有千秋。pjwhash與elfhash效果最差,但得分相似,其演算法本質是相似的。
在資訊修競賽中,要本著易於編碼除錯的原則,個人認為bkdrhash是最適合記憶和使用的。
byvoid原創,歡迎建議、交流、批評和指正。
附:各種雜湊函式的c語言程式**
// bkdr hash function
unsigned int bkdrhash(char *str)
// ap hash function
unsigned int aphash(char *str)
// djb hash function
unsigned int djbhash(char *str)
// js hash function
unsigned int jshash(char *str)
// rs hash function
unsigned int rshash(char *str)
return (hash & 0x7fffffff);
} unsigned int sdbmhash(char *str)
// p. j. weinberger hash function
unsigned int pjwhash(char *str)
return (hash & 0x7fffffff);
} // elf hash function
unsigned int elfhash(char *str)
} return (hash & 0x7fffffff);
}
各種字串Hash函式比較
文章 自 常用的字串hash函式還有elfhash,aphash等等,都是十分簡單有效的方法。這些函式使用 位運算使得每乙個字元都對最後的函式值產生影響。另外還有以md5和sha1為代表的雜湊函式,這些函式幾乎不可能找到碰撞。常用字串雜湊函式有bkdrhash,aphash,djbhash,jsha...
各種字串hash函式比較
文章 自 常用的字串hash函式還有elfhash,aphash等等,都是十分簡單有效的方法。這些函式使用 位運算使得每乙個字元都對最後的函式值產生影響。另外還有以md5和sha1為代表的雜湊函式,這些函式幾乎不可能找到碰撞。常用字串雜湊函式有bkdrhash,aphash,djbhash,jsha...
各種字串Hash函式比較
常用的字串hash函式還有elfhash,aphash等等,都是十分簡單有效的方法。這些函式使用位運算使得每乙個字元都對最後的函式值產生影響。另外還有以md5和sha1為代表的雜湊函式,這些函式幾乎不可能找到碰撞。常用字串雜湊函式有bkdrhash,aphash,djbhash,jshash,rsh...