字串雜湊到整數函式,演算法

2021-06-22 00:17:13 字數 2750 閱讀 7944

基本概念

所謂完美雜湊函式,就是指沒有衝突的雜湊函式,即對任意的 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效果最差,但得分相似,其演算法本質是相似的。

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函式

//

用跟元素個數最接近的質數作為雜湊表的大小

#define nhash 29989

#define mult 31unsigned

in hash(char *p)

**:

雜湊 字串雜湊演算法

給定乙個長度為n的字串,再給定m個詢問,每個詢問包含四個整數l1,r1,l2,r2,請你判斷 l1,r1 和 l2,r2 這兩個區間所包含的字串子串是否完全相同。字串中只包含大小寫英文本母和數字。輸入格式 第一行包含整數n和m,表示字串長度和詢問次數。第二行包含乙個長度為n的字串,字串中只包含大小寫...

字串演算法 字串雜湊

方法以,m進製的形式來表示乙個字串,那麼這個字串就可以輕鬆計算 i j 之間的hash值 當只有小寫 大家字母時,m 131 而hash值,可以使用unsigned long long 來表示,這時不再需要求餘 方法應用 字串匹配。思路 對比hash值 允許k次失配的字串匹配 即 允許k次字元值不對...

字串 字串雜湊hash演算法

以洛谷p3370為引子引入吧 雜湊其實是所有字串操作中,筆者認為最簡單的操作了 except輸入輸出qwq 雜湊的過程,其實可以看作對乙個串的單向加密過程,並且需要保證所加的密不能高概率重複 就像不能讓隔壁老王輕易地用它家的鑰匙開啟你家門一樣qwq 通過這種方式來替代一些很費時間的操作。比如,最常見...