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/
原文地址:https://www.cnblogs.com/virusolf/p/4908677.html