各种字符串hash函数

  1. /// @brief BKDR Hash Function  
  2. /// @detail 本 算法由于在Brian Kernighan与Dennis Ritchie的《The C Programming Language》一书被展示而得 名,是一种简单快捷的hash算法,也是Java目前采用的字符串的Hash算法(累乘因子为31)。  
  3. size_t BKDRHash(const char *str)  
  4. {  
  5.     register size_t hash = 0;  
  6.     while (size_t ch = (size_t)*str++)  
  7.     {         
  8.         hash = hash * 131 + ch;   // 也可以乘以31、131、1313、13131、131313..  
  9.         // 有人说将乘法分解为位运算及加减法可以提高效率,如将上式表达为:hash = hash << 7 + hash << 1 + hash + ch;  
  10.         // 但其实在Intel平台上,CPU内部对二者的处理效率都是差不多的,  
  11.         // 我分别进行了100亿次的上述两种运算,发现二者时间差距基本为0(如果是Debug版,分解成位运算后的耗时还要高1/3);  
  12.         // 在ARM这类RISC系统上没有测试过,由于ARM内部使用Booth's Algorithm来模拟32位整数乘法运算,它的效率与乘数有关:  
  13.         // 当乘数8-31位都为1或0时,需要1个时钟周期  
  14.         // 当乘数16-31位都为1或0时,需要2个时钟周期  
  15.         // 当乘数24-31位都为1或0时,需要3个时钟周期  
  16.         // 否则,需要4个时钟周期  
  17.         // 因此,虽然我没有实际测试,但是我依然认为二者效率上差别不大          
  18.     }  
  19.     return hash;  
  20. }  
  21. /// @brief SDBM Hash Function  
  22. /// @detail 本算法是由于在开源项目SDBM(一种简单的数据库引擎)中被应用而得名,它与BKDRHash思想一致,只是种子不同而已。  
  23. size_t SDBMHash(const char *str)  
  24. {  
  25.     register size_t hash = 0;  
  26.     while (size_t ch = (size_t)*str++)  
  27.     {  
  28.         hash = 65599 * hash + ch;         
  29.         //hash = (size_t)ch + (hash << 6) + (hash << 16) - hash;  
  30.     }  
  31.     return hash;  
  32. }  
  33. /// @brief RS Hash Function  
  34. /// @detail 因Robert Sedgwicks在其《Algorithms in C》一书中展示而得名。  
  35. size_t RSHash(const char  *str)  
  36. {  
  37.     register size_t hash = 0;  
  38.     size_t magic = 63689;     
  39.     while (size_t ch = (size_t)*str++)  
  40.     {  
  41.         hash = hash * magic + ch;  
  42.         magic *= 378551;  
  43.     }  
  44.     return hash;  
  45. }  
  46. /// @brief AP Hash Function  
  47. /// @detail 由Arash Partow发明的一种hash算法。  
  48. size_t APHash(const char  *str)  
  49. {  
  50.     register size_t hash = 0;  
  51.     size_t ch;  
  52.     for (long i = 0; ch = (size_t)*str++; i++)  
  53.     {  
  54.         if ((i & 1) == 0)  
  55.         {  
  56.             hash ^= ((hash << 7) ^ ch ^ (hash >> 3));  
  57.         }  
  58.         else  
  59.         {  
  60.             hash ^= (~((hash << 11) ^ ch ^ (hash >> 5)));  
  61.         }  
  62.     }  
  63.     return hash;  
  64. }  
  65. /// @brief JS Hash Function  
  66. /// 由Justin Sobel发明的一种hash算法。  
  67. size_t JSHash(const char  *str)  
  68. {  
  69.     if(!*str)        // 这是由本人添加,以保证空字符串返回哈希值0  
  70.         return 0;  
  71.     register size_t hash = 1315423911;  
  72.     while (size_t ch = (size_t)*str++)  
  73.     {  
  74.         hash ^= ((hash << 5) + ch + (hash >> 2));  
  75.     }  
  76.     return hash;  
  77. }  
  78. /// @brief DEK Function  
  79. /// @detail 本算法是由于Donald E. Knuth在《Art Of Computer Programming Volume 3》中展示而得名。  
  80. size_t DEKHash(const char * str)  
  81. {  
  82.     if(!*str)        // 这是由本人添加,以保证空字符串返回哈希值0  
  83.         return 0;  
  84.     register size_t hash = 1315423911;  
  85.     while (size_t ch = (size_t)*str++)  
  86.     {  
  87.         hash = ((hash << 5) ^ (hash >> 27)) ^ ch;  
  88.     }  
  89.     return hash;  
  90. }  
  91. /// @brief FNV Hash Function  
  92. /// @detail Unix system系统中使用的一种著名hash算法,后来微软也在其hash_map中实现。  
  93. size_t FNVHash(const char * str)  
  94. {  
  95.     if(!*str)   // 这是由本人添加,以保证空字符串返回哈希值0  
  96.         return 0;  
  97.     register size_t hash = 2166136261;  
  98.     while (size_t ch = (size_t)*str++)  
  99.     {  
  100.         hash *= 16777619;  
  101.         hash ^= ch;  
  102.     }  
  103.     return hash;  
  104. }  
  105. /// @brief DJB Hash Function  
  106. /// @detail 由Daniel J. Bernstein教授发明的一种hash算法。  
  107. size_t DJBHash(const char  *str)  
  108. {  
  109.     if(!*str)   // 这是由本人添加,以保证空字符串返回哈希值0  
  110.         return 0;  
  111.     register size_t hash = 5381;  
  112.     while (size_t ch = (size_t)*str++)  
  113.     {  
  114.         hash += (hash << 5) + ch;  
  115.     }  
  116.     return hash;  
  117. }  
  118. /// @brief DJB Hash Function 2  
  119. /// @detail 由Daniel J. Bernstein 发明的另一种hash算法。  
  120. size_t DJB2Hash(const char  *str)  
  121. {  
  122.     if(!*str)   // 这是由本人添加,以保证空字符串返回哈希值0  
  123.         return 0;  
  124.     register size_t hash = 5381;  
  125.     while (size_t ch = (size_t)*str++)  
  126.     {  
  127.         hash = hash * 33 ^ ch;  
  128.     }  
  129.     return hash;  
  130. }  
  131. /// @brief PJW Hash Function  
  132. /// @detail 本算法是基于AT&T贝尔实验室的Peter J. Weinberger的论文而发明的一种hash算法。  
  133. size_t PJWHash(const char  *str)  
  134. {  
  135.     static const size_t TotalBits       = sizeof(size_t) * 8;  
  136.     static const size_t ThreeQuarters   = (TotalBits  * 3) / 4;  
  137.     static const size_t OneEighth       = TotalBits / 8;  
  138.     static const size_t HighBits        = ((size_t)-1) << (TotalBits - OneEighth);      
  139.       
  140.     register size_t hash = 0;  
  141.     size_t magic = 0;     
  142.     while (size_t ch = (size_t)*str++)  
  143.     {  
  144.         hash = (hash << OneEighth) + ch;  
  145.         if ((magic = hash & HighBits) != 0)  
  146.         {  
  147.             hash = ((hash ^ (magic >> ThreeQuarters)) & (~HighBits));  
  148.         }  
  149.     }  
  150.     return hash;  
  151. }  
  152. /// @brief ELF Hash Function  
  153. /// @detail 由于在Unix的Extended Library Function被附带而得名的一种hash算法,它其实就是PJW Hash的变形。  
  154. size_t ELFHash(const char  *str)  
  155. {  
  156.     static const size_t TotalBits       = sizeof(size_t) * 8;  
  157.     static const size_t ThreeQuarters   = (TotalBits  * 3) / 4;  
  158.     static const size_t OneEighth       = TotalBits / 8;  
  159.     static const size_t HighBits        = ((size_t)-1) << (TotalBits - OneEighth);      
  160.     register size_t hash = 0;  
  161.     size_t magic = 0;  
  162.     while (size_t ch = (size_t)*str++)  
  163.     {  
  164.         hash = (hash << OneEighth) + ch;  
  165.         if ((magic = hash & HighBits) != 0)  
  166.         {  
  167.             hash ^= (magic >> ThreeQuarters);  
  168.             hash &= ~magic;  
  169.         }         
  170.     }  
  171.     return hash;  
  172. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值