常用字符串hash函数

  1. 常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法。这些函数使用
  2. 位运算使得每一个字符都对最后的函数值产生影响。另外还有以MD5和SHA1为代表的杂凑函数,
  3. 这些函数几乎不可能找到碰撞。
  4. 常用字符串哈希函数有BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,
  5. PJWHash,ELFHash等等。对于以上几种哈希函数,我对其进行了一个小小的评测。
  6. Hash函数数据1数据2数据3数据4数据1得分数据2得分数据3得分数据4得分平均分
  7. BKDRHash20477448196.5510090.9582.0592.64
  8. APHash23475449396.5588.4610051.2886.28
  9. DJBHash22497547496.5592.31010083.43
  10. JSHash14476150610084.6296.8317.9581.94
  11. RSHash10486150510010051.5820.5175.96
  12. SDBMHash32484950493.192.3157.0123.0872.41
  13. PJWHash302648785130043.89021.95
  14. ELFHash302648785130043.89021.95
  15. 其中数据1为100000个字母和数字组成的随机串哈希冲突个数。数据2为100000个有意义的英文句
  16. 子哈希冲突个数。数据3为数据1的哈希值与1000003(大素数)求模后存储到线性表中冲突的个数。
  17. 数据4为数据1的哈希值与10000019(更大素数)求模后存储到线性表中冲突的个数。
  18. 经过比较,得出以上平均得分。平均数为平方平均数。可以发现,BKDRHash无论是在实际效果还是
  19. 编码实现中,效果都是最突出的。APHash也是较为优秀的算法。DJBHash,JSHash,RSHash与
  20. SDBMHash各有千秋。PJWHash与ELFHash效果最差,但得分相似,其算法本质是相似的。
  21. 在信息修竞赛中,要本着易于编码调试的原则,个人认为BKDRHash是最适合记忆和使用的。
  22. CmYkRgB123原创,欢迎建议、交流、批评和指正。
  23. 附:各种哈希函数的C语言程序代码
  24. unsignedintSDBMHash(char*str)
  25. {
  26. unsignedinthash=0;
  27. while(*str)
  28. {
  29. //equivalentto:hash=65599*hash+(*str++);
  30. hash=(*str++)+(hash<<6)+(hash<<16)-hash;
  31. }
  32. return(hash&0x7FFFFFFF);
  33. }
  34. //RSHash
  35. unsignedintRSHash(char*str)
  36. {
  37. unsignedintb=378551;
  38. unsignedinta=63689;
  39. unsignedinthash=0;
  40. while(*str)
  41. {
  42. hash=hash*a+(*str++);
  43. a*=b;
  44. }
  45. return(hash&0x7FFFFFFF);
  46. }
  47. //JSHash
  48. unsignedintJSHash(char*str)
  49. {
  50. unsignedinthash=1315423911;
  51. while(*str)
  52. {
  53. hash^=((hash<<5)+(*str++)+(hash>>2));
  54. }
  55. return(hash&0x7FFFFFFF);
  56. }
  57. //P.J.WeinbergerHash
  58. unsignedintPJWHash(char*str)
  59. {
  60. unsignedintBitsInUnignedInt=(unsignedint)(sizeof(unsignedint)*8);
  61. unsignedintThreeQuarters=(unsignedint)((BitsInUnignedInt*3)/4);
  62. unsignedintOneEighth=(unsignedint)(BitsInUnignedInt/8);
  63. unsignedintHighBits=(unsignedint)(0xFFFFFFFF)<<(BitsInUnignedInt
  64. -OneEighth);
  65. unsignedinthash=0;
  66. unsignedinttest=0;
  67. while(*str)
  68. {
  69. hash=(hash<<OneEighth)+(*str++);
  70. if((test=hash&HighBits)!=0)
  71. {
  72. hash=((hash^(test>>ThreeQuarters))&(~HighBits));
  73. }
  74. }
  75. return(hash&0x7FFFFFFF);
  76. }
  77. //ELFHash
  78. unsignedintELFHash(char*str)
  79. {
  80. unsignedinthash=0;
  81. unsignedintx=0;
  82. while(*str)
  83. {
  84. hash=(hash<<4)+(*str++);
  85. if((x=hash&0xF0000000L)!=0)
  86. {
  87. hash^=(x>>24);
  88. hash&=~x;
  89. }
  90. }
  91. return(hash&0x7FFFFFFF);
  92. }
  93. //BKDRHash
  94. unsignedintBKDRHash(char*str)
  95. {
  96. unsignedintseed=131;//31131131313131131313etc..
  97. unsignedinthash=0;
  98. while(*str)
  99. {
  100. hash=hash*seed+(*str++);
  101. }
  102. return(hash&0x7FFFFFFF);
  103. }
  104. //DJBHash
  105. unsignedintDJBHash(char*str)
  106. {
  107. unsignedinthash=5381;
  108. while(*str)
  109. {
  110. hash+=(hash<<5)+(*str++);
  111. }
  112. return(hash&0x7FFFFFFF);
  113. }
  114. //APHash
  115. unsignedintAPHash(char*str)
  116. {
  117. unsignedinthash=0;
  118. inti;
  119. for(i=0;*str;i++)
  120. {
  121. if((i&1)==0)
  122. {
  123. hash^=((hash<<7)^(*str++)^(hash>>3));
  124. }
  125. else
  126. {
  127. hash^=(~((hash<<11)^(*str++)^(hash>>5)));
  128. }
  129. }
  130. return(hash&0x7FFFFFFF);
  131. }

【以上内容转载自:http://explorers.javaeye.com/blog/698377

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值