zoukankan      html  css  js  c++  java
  • hash function比较

    http://blog.csdn.net/kingstar158/article/details/8028635

    由于工作需要,针对千万级别的数据,使用stl::map着实存在着效率问题,最后使用boost::unordered_map替代前者,发现效率上有很大的提升,但是还是无法达到我们的需求;

    stl::map  底层算法:B+tree 实现

    boost::unordered_map 底层算法:hash 实现

    所以可能要针对不同的数据类型编写hash function来优化查找和插入的效率,自己编写,着实没有这个实力,只有在google上来寻找先辈们的精妙算法来借鉴:

    常用字符串哈希函数有BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash等等;

    有前辈做了评测:如下

    ash函数 数据1 数据2 数据3 数据4 数据1得分 数据2得分 数据3得分 数据4得分 平均分
    BKDRHash 2 0 4774 481 96.55 100 90.95 82.05 92.64
    APHash 2 3 4754 493 96.55 88.46 100 51.28 86.28
    DJBHash 2 2 4975 474 96.55 92.31 0 100 83.43
    JSHash 1 4 4761 506 100 84.62 96.83 17.95 81.94
    RSHash 1 0 4861 505 100 100 51.58 20.51 75.96
    SDBMHash 3 2 4849 504 93.1 92.31 57.01 23.08 72.41
    PJWHash 30 26 4878 513 0 0 43.89 0 21.95
    ELFHash 30 26 4878 513 0 0 43.89 0 21.95


    其中数据1为100000个字母和数字组成的随机串哈希冲突个数。数据2为100000个有意义的英文句子哈希冲突个数。数据3为数据1的哈希值与1000003(大素数)求模后存储到线性表中冲突的个数。数据4为数据1的哈希值与10000019(更大素数)求模后存储到线性表中冲突的个数。

    各种hash function的C 语言实现:

      1. unsigned int SDBMHash(char *str)  
      2. {  
      3.     unsigned int hash = 0;  
      4.    
      5.     while (*str)  
      6.     {  
      7.         // equivalent to: hash = 65599*hash + (*str++);  
      8.         hash = (*str++) + (hash << 6) + (hash << 16) - hash;  
      9.     }  
      10.    
      11.     return (hash & 0x7FFFFFFF);  
      12. }  
      13.    
      14. // RS Hash Function  
      15. unsigned int RSHash(char *str)  
      16. {  
      17.     unsigned int b = 378551;  
      18.     unsigned int a = 63689;  
      19.     unsigned int hash = 0;  
      20.    
      21.     while (*str)  
      22.     {  
      23.         hash = hash * a + (*str++);  
      24.         a *= b;  
      25.     }  
      26.    
      27.     return (hash & 0x7FFFFFFF);  
      28. }  
      29.    
      30. // JS Hash Function  
      31. unsigned int JSHash(char *str)  
      32. {  
      33.     unsigned int hash = 1315423911;  
      34.    
      35.     while (*str)  
      36.     {  
      37.         hash ^= ((hash << 5) + (*str++) + (hash >> 2));  
      38.     }  
      39.    
      40.     return (hash & 0x7FFFFFFF);  
      41. }  
      42.    
      43. // P. J. Weinberger Hash Function  
      44. unsigned int PJWHash(char *str)  
      45. {  
      46.     unsigned int BitsInUnignedInt = (unsigned int)(sizeof(unsigned int) * 8);  
      47.     unsigned int ThreeQuarters  = (unsigned int)((BitsInUnignedInt  * 3) / 4);  
      48.     unsigned int OneEighth      = (unsigned int)(BitsInUnignedInt / 8);  
      49.     unsigned int HighBits        = (unsigned int)(0xFFFFFFFF) << (BitsInUnignedInt - OneEighth);  
      50.     unsigned int hash            = 0;  
      51.     unsigned int test            = 0;  
      52.    
      53.     while (*str)  
      54.     {  
      55.         hash = (hash << OneEighth) + (*str++);  
      56.         if ((test = hash & HighBits) != 0)  
      57.         {  
      58.             hash = ((hash ^ (test >> ThreeQuarters)) & (~HighBits));  
      59.         }  
      60.     }  
      61.    
      62.     return (hash & 0x7FFFFFFF);  
      63. }  
      64.    
      65. // ELF Hash Function  
      66. unsigned int ELFHash(char *str)  
      67. {  
      68.     unsigned int hash = 0;  
      69.     unsigned int x  = 0;  
      70.    
      71.     while (*str)  
      72.     {  
      73.         hash = (hash << 4) + (*str++);  
      74.         if ((x = hash & 0xF0000000L) != 0)  
      75.         {  
      76.             hash ^= (x >> 24);  
      77.             hash &= ~x;  
      78.         }  
      79.     }  
      80.    
      81.     return (hash & 0x7FFFFFFF);  
      82. }  
      83.    
      84. // BKDR Hash Function  
      85. unsigned int BKDRHash(char *str)  
      86. {  
      87.     unsigned int seed = 131; // 31 131 1313 13131 131313 etc..  
      88.     unsigned int hash = 0;  
      89.    
      90.     while (*str)  
      91.     {  
      92.         hash = hash * seed + (*str++);  
      93.     }  
      94.    
      95.     return (hash & 0x7FFFFFFF);  
      96. }  
      97.    
      98. // DJB Hash Function  
      99. unsigned int DJBHash(char *str)  
      100. {  
      101.     unsigned int hash = 5381;  
      102.    
      103.     while (*str)  
      104.     {  
      105.         hash += (hash << 5) + (*str++);  
      106.     }  
      107.    
      108.     return (hash & 0x7FFFFFFF);  
      109. }  
      110.    
      111. // AP Hash Function  
      112. unsigned int APHash(char *str)  
      113. {  
      114.     unsigned int hash = 0;  
      115.     int i;  
      116.    
      117.     for (i=0; *str; i++)  
      118.     {  
      119.         if ((i & 1) == 0)  
      120.         {  
      121.             hash ^= ((hash << 7) ^ (*str++) ^ (hash >> 3));  
      122.         }  
      123.         else  
      124.         {  
      125.             hash ^= (~((hash << 11) ^ (*str++) ^ (hash >> 5)));  
      126.         }  
      127.     }  
      128.    
      129.     return (hash & 0x7FFFFFFF);  
      130. }  
      131. https://www.byvoid.com/blog/string-hash-compare/
  • 相关阅读:
    SQL优化索引
    如何减轻工作压力(一)
    奥巴马对美国影响最大的十句话
    10种职场潜规则
    Linux中的7件武器详解
    linux时间同步,ntpd、ntpdate
    Style中Position属性详解
    vsftp配置大全超完整版
    Linux 技巧:使用 screen 管理你的远程会话
    MySQL下mysql.sock丢失问题的解决
  • 原文地址:https://www.cnblogs.com/virusolf/p/4908677.html
Copyright © 2011-2022 走看看