字符串Hash函数对比

今天根据自己的理解重新整理了一下几个字符串hash函数,使用了模板,使其支持宽字符串,代码如下:

 

 

 

 

 

 

 

我对这些hash的散列质量及效率作了一个简单测试,测试结果如下:

测试1:对100000个由大小写字母与数字随机的ANSI字符串(无重复,每个字符串最大长度不超过64字符)进行散列:

字符串函数冲突数除1000003取余后的冲突数

BKDRHash

04826

SDBMHash

24814

RSHash

24886

APHash

04846

ELFHash

15156120

JSHash

7795587

DEKHash

8635643

FNVHash

24872

DJBHash

8325645

DJB2Hash

6955309

PJWHash

15156120

 

测试2:对100000个由任意UNICODE组成随机字符串(无重复,每个字符串最大长度不超过64字符)进行散列:

字符串函数冲突数除1000003取余后的冲突数

BKDRHash

34710

SDBMHash

34904

RSHash

34822

APHash

24891

ELFHash

164869

JSHash

34812

DEKHash

14755

FNVHash

14803

DJBHash

14749

DJB2Hash

24817

PJWHash

164869

 

测试3:对1000000个随机ANSI字符串(无重复,每个字符串最大长度不超过64字符)进行散列:

字符串函数耗时(毫秒)

BKDRHash

109

SDBMHash

109

RSHash

124

APHash

187

ELFHash

249

JSHash

172

DEKHash

140

FNVHash

125

DJBHash

125

DJB2Hash

125

PJWHash

234

 

结论:也许是我的样本存在一些特殊性,在对ASCII码字符串进行散列时,PJW与ELF Hash(它们其实是同一种算法)无论是质量还是效率,都相当糟糕;例如:"b5"与“aE",这两个字符串按照PJW散列出来的hash值就是一样的。另外,其它几种依靠异或来散列的哈希函数,如:JS/DEK/DJB Hash,在对字母与数字组成的字符串的散列效果也不怎么好。相对而言,还是BKDR与SDBM这类简单的Hash效率与效果更好。

其他

作者:icefireelf

出处:http://blog.youkuaiyun.com/icefireelf/article/details/5796529

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值