字符串hash函数(hashCode的生成)

本文探讨了多种字符串哈希函数,如BKDRHash、SDBMHash、RSHash等,通过测试发现,BKDRHash在实际效果和编码实现上表现最佳。哈希冲突的解决方案包括使用链表和多哈希值校验。哈希函数在查找性能上的优势使其在高效数据处理中广泛应用。
摘要由CSDN通过智能技术生成


非常好的外文网站!!!:


General Purpose Hash Function Algorithms

http://www.partow.net/programming/hashfunctions/#top


最终结果:

1.  BKDRHash

2. Blizzard hash

(http://sfsrealm.hopto.org/inside_mopaq/chapter2.htmhttp://blog.csdn.net/eaglewood2005/article/details/4394583,  http://blog.sina.com.cn/s/blog_5b29caf701015tpb.html)


**************

Java 版:


今天根据自己的理解重新整理了一下几个字符串hash函数,使用了模板,使其支持宽字符串,代码如下:
[cpp]  view plain copy
  1. /// @brief BKDR Hash Function  
  2. /// @detail 本算法由于在Brian Kernighan与Dennis Ritchie的《The C Programming Language》一书被展示而得名,是一种简单快捷的hash算法,也是Java目前采用的字符串的Hash算法(累乘因子为31)。  
  3. template<class T>  
  4. size_t BKDRHash(const T *str)  
  5. {  
  6.     register size_t hash = 0;  
  7.     while (size_t ch = (size_t)*str++)  
  8.     {         
  9.         hash = hash * 131 + ch;   // 也可以乘以31、131、1313、13131、131313..  
  10.         // 有人说将乘法分解为位运算及加减法可以提高效率,如将上式表达为:hash = hash << 7 + hash << 1 + hash + ch;  
  11.         // 但其实在Intel平台上,CPU内部对二者的处理效率都是差不多的,  
  12.         // 我分别进行了100亿次的上述两种运算,发现二者时间差距基本为0(如果是Debug版,分解成位运算后的耗时还要高1/3);  
  13.         // 在ARM这类RISC系统上没有测试过,由于ARM内部使用Booth's Algorithm来模拟32位整数乘法运算,它的效率与乘数有关:  
  14.         // 当乘数8-31位都为1或0时,需要1个时钟周期  
  15.         // 当乘数16-31位都为1或0时,需要2个时钟周期  
  16.         // 当乘数24-31位都为1或0时,需要3个时钟周期  
  17.         // 否则,需要4个时钟周期  
  18.         // 因此,虽然我没有实际测试,但是我依然认为二者效率上差别不大          
  19.     }  
  20.     return hash;  
  21. }  
  22. /// @brief SDBM Hash Function  
  23. /// @detail 本算法是由于在开源项目SDBM(一种简单的数据库引擎)中被应用而得名,它与BKDRHash思想一致,只是种子不同而已。  
  24. template<class T>  
  25. size_t SDBMHash(const T *str)  
  26. {  
  27.     register size_t hash = 0;  
  28.     while (size_t ch = (size_t)*str++)  
  29.     {  
  30.         hash = 65599 * hash + ch;         
  31.         //hash = (size_t)ch + (hash << 6) + (hash << 16) - hash;  
  32.     }  
  33.     return hash;  
  34. }  
  35. /// @brief RS Hash Function  
  36. /// @detail 因Robert Sedgwicks在其《Algorithms in C》一书中展示而得名。  
  37. template<class T>  
  38. size_t RSHash(const T *str)  
  39. {  
  40.     register size_t hash = 0;  
  41.     size_t magic = 63689;     
  42.     while (size_t ch = (size_t)*str++)  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值