常用的字串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是最適合記憶和使用的。
附:各種雜湊函式的c語言程式**
// bkdr hash
unsigned
int bkdrhash(
char
*str)
return
(hash &
0x7fffffff);
} unsigned
int hash(
char
*str)
return
(hash &
0x7fffffff);
}// rs hash
unsigned
int rshash(
char
*str)
return
(hash &
0x7fffffff);
}// js hash
unsigned
int jshash(
char
*str)
return
(hash &
0x7fffffff);
}// p. j. weinberger hash
unsigned
int pjwhash(
char
*str)
}return
(hash &
0x7fffffff);
}// elf hash
unsigned
int elfhash(
char
*str)
}return
(hash &
0x7fffffff);
}// djb hash
unsigned
int djbhash(
char
*str)
return
(hash &
0x7fffffff);
}// ap hash
unsigned
int aphash(
char
*str)
else
}return
(hash &
0x7fffffff);
}from
字串經典hash函式
常用的字串hash函式還有elfhash,aphash等等,都是十分簡單有效的方法。這些函式使用 位運算使得每乙個字元都對最後的函式值產生影響。另外還有以md5和sha1為代表的雜湊函式,這些函式幾乎不可能找到碰撞。常用字串雜湊函式有bkdrhash,aphash,djbhash,jshash,rs...
字串HASH函式
常用的字串hash函式還有elfhash,aphash等等,都是十分簡單有效的方法。這些函式使用 位運算使得每乙個字元都對最後的函式值產生影響。另外還有以md5和sha1為代表的雜湊函式,這些函式幾乎不可能找到碰撞。常用字串雜湊函式有bkdrhash,aphash,djbhash,jshash,rs...
字串Hash函式
字串hash函式把乙個任意長度的字串對映成乙個非負整數,並且其衝突概率幾乎為0 字串hash函式 取一固定值p,把字串看做p進製數,並分配乙個大於零的的數值,代表每種字元,取一固定值m,求出該p進製對m的餘數,作為該字元的hash值 一般來說,我們取p 131或p 13331,此時hash值產生衝突...