字串 hash 雜湊比較

2021-06-23 00:37:11 字數 2330 閱讀 8307

常用的字串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效果最差,但得分相似,其演算法本質是相似的。

在資訊修競賽中,要本著易於編碼除錯的原則,個人認為bkdrhash是最適合記憶和使用的。

byvoid原創,歡迎建議、交流、批評和指正。

附:各種雜湊函式的c語言程式**

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);

}

字串 雜湊 比較 各種字串Hash函式比較

常用的字串hash函式還有elfhash,aphash等等,都是十分簡單有效的方法。這些函式使用位運算使得每乙個字元都對最後的函式值產生影響。另外還有以md5和sha1為代表的雜湊函式,這些函式幾乎不可能找到碰撞。常用字串雜湊函式有bkdrhash,aphash,djbhash,jshash,rsh...

字串雜湊 Hash

字串雜湊,用通俗點的說法就是將乙個字串轉換成乙個整數,而且用雜湊轉換出來的整數,不同的字串,不出意外整數也不一樣 存在極少的情況一樣 從而更方便地確定某個字串是否重複出現過或者對字串進行其他的判斷。基本思想 假設乙個字串 abcdabcd 將整個字串看成乙個p p一般取131或者13331比較好,可...

Hash 字串 字串雜湊

luo gu luogu luogup 3370 p3370 p337 0如題,給定n個字串 第i個字串長度為mi,字串內包含數字 大小寫字母 請求出n個字串中共有多少個不同的字串。第一行包含乙個整數n,為字串的個數。接下來n行每行包含乙個字串,為所提供的字串。輸出包含一行,包含乙個整數,為不同的字...