字符串哈希算法

来源:互联网 发布:mac os 分辨率设置 编辑:程序博客网 时间:2024/05/01 03:31
  1. 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++) 
    43.    { 
    44.        hash = hash * magic + ch; 
    45.        magic *= 378551; 
    46.    } 
    47.    return hash; 
    48.} 
    49./// @brief AP Hash Function 
    50./// @detail 由Arash Partow发明的一种hash算法。 
    51.template<class T> 
    52.size_t APHash(const T *str) 
    53.{ 
    54.    register size_t hash = 0; 
    55.    size_t ch; 
    56.    for (long i = 0; ch = (size_t)*str++; i++) 
    57.    { 
    58.        if ((i & 1) == 0) 
    59.        { 
    60.            hash ^= ((hash << 7) ^ ch ^ (hash >> 3)); 
    61.        } 
    62.        else 
    63.        { 
    64.            hash ^= (~((hash << 11) ^ ch ^ (hash >> 5))); 
    65.        } 
    66.    } 
    67.    return hash; 
    68.} 
    69./// @brief JS Hash Function 
    70./// 由Justin Sobel发明的一种hash算法。 
    71.template<class T> 
    72.size_t JSHash(const T *str) 
    73.{ 
    74.    if(!*str)        // 这是由本人添加,以保证空字符串返回哈希值0 
    75.        return 0; 
    76.    register size_t hash = 1315423911; 
    77.    while (size_t ch = (size_t)*str++) 
    78.    { 
    79.        hash ^= ((hash << 5) + ch + (hash >> 2)); 
    80.    } 
    81.    return hash; 
    82.} 
    83./// @brief DEK Function 
    84./// @detail 本算法是由于Donald E. Knuth在《Art Of Computer Programming Volume 3》中展示而得名。 
    85.template<class T> 
    86.size_t DEKHash(const T* str) 
    87.{ 
    88.    if(!*str)        // 这是由本人添加,以保证空字符串返回哈希值0 
    89.        return 0; 
    90.    register size_t hash = 1315423911; 
    91.    while (size_t ch = (size_t)*str++) 
    92.    { 
    93.        hash = ((hash << 5) ^ (hash >> 27)) ^ ch; 
    94.    } 
    95.    return hash; 
    96.} 
    97./// @brief FNV Hash Function 
    98./// @detail Unix system系统中使用的一种著名hash算法,后来微软也在其hash_map中实现。 
    99.template<class T> 
    100.size_t FNVHash(const T* str) 
    101.{ 
    102.    if(!*str)   // 这是由本人添加,以保证空字符串返回哈希值0 
    103.        return 0; 
    104.    register size_t hash = 2166136261; 
    105.    while (size_t ch = (size_t)*str++) 
    106.    { 
    107.        hash *= 16777619; 
    108.        hash ^= ch; 
    109.    } 
    110.    return hash; 
    111.} 
    112./// @brief DJB Hash Function 
    113./// @detail 由Daniel J. Bernstein教授发明的一种hash算法。 
    114.template<class T> 
    115.size_t DJBHash(const T *str) 
    116.{ 
    117.    if(!*str)   // 这是由本人添加,以保证空字符串返回哈希值0 
    118.        return 0; 
    119.    register size_t hash = 5381; 
    120.    while (size_t ch = (size_t)*str++) 
    121.    { 
    122.        hash += (hash << 5) + ch; 
    123.    } 
    124.    return hash; 
    125.} 
    126./// @brief DJB Hash Function 2 
    127./// @detail 由Daniel J. Bernstein 发明的另一种hash算法。 
    128.template<class T> 
    129.size_t DJB2Hash(const T *str) 
    130.{ 
    131.    if(!*str)   // 这是由本人添加,以保证空字符串返回哈希值0 
    132.        return 0; 
    133.    register size_t hash = 5381; 
    134.    while (size_t ch = (size_t)*str++) 
    135.    { 
    136.        hash = hash * 33 ^ ch; 
    137.    } 
    138.    return hash; 
    139.} 
    140./// @brief PJW Hash Function 
    141./// @detail 本算法是基于AT&T贝尔实验室的Peter J. Weinberger的论文而发明的一种hash算法。 
    142.template<class T> 
    143.size_t PJWHash(const T *str) 
    144.{ 
    145.    static const size_t TotalBits       = sizeof(size_t) * 8; 
    146.    static const size_t ThreeQuarters   = (TotalBits  * 3) / 4; 
    147.    static const size_t OneEighth       = TotalBits / 8; 
    148.    static const size_t HighBits        = ((size_t)-1) << (TotalBits - OneEighth);     
    149.     
    150.    register size_t hash = 0; 
    151.    size_t magic = 0;    
    152.    while (size_t ch = (size_t)*str++) 
    153.    { 
    154.        hash = (hash << OneEighth) + ch; 
    155.        if ((magic = hash & HighBits) != 0) 
    156.        { 
    157.            hash = ((hash ^ (magic >> ThreeQuarters)) & (~HighBits)); 
    158.        } 
    159.    } 
    160.    return hash; 
    161.} 
    162./// @brief ELF Hash Function 
    163./// @detail 由于在Unix的Extended Library Function被附带而得名的一种hash算法,它其实就是PJW Hash的变形。 
    164.template<class T> 
    165.size_t ELFHash(const T *str) 
    166.{ 
    167.    static const size_t TotalBits       = sizeof(size_t) * 8; 
    168.    static const size_t ThreeQuarters   = (TotalBits  * 3) / 4; 
    169.    static const size_t OneEighth       = TotalBits / 8; 
    170.    static const size_t HighBits        = ((size_t)-1) << (TotalBits - OneEighth);     
    171.    register size_t hash = 0; 
    172.    size_t magic = 0; 
    173.    while (size_t ch = (size_t)*str++) 
    174.    { 
    175.        hash = (hash << OneEighth) + ch; 
    176.        if ((magic = hash & HighBits) != 0) 
    177.        { 
    178.            hash ^= (magic >> ThreeQuarters); 
    179.            hash &= ~magic; 
    180.        }        
    181.    } 
    182.    return hash; 
    183.} 

0 0
原创粉丝点击