9种哈希算法代码

// 这个算法在开源的SDBM中使用,似乎对很多不同类型的数据都能得到不错的分布。
unsigned int SDBMHash(const char  *str)
{
    unsigned int hash =  0 ;
    while  (*str)
    {
        // equivalent to: hash = 65599*hash + (*str++);
        hash = (*str++) + (hash << 6 ) + (hash <<  16 ) - hash;
    }

    return  (hash &  0x7FFFFFFF );
}

// 从Robert Sedgwicks的 Algorithms in C一书中得到。
// 已经添加了一些简单的优化的算法,以加快其散列过程。
unsigned int  RSHash(const char  *str)
{
    unsigned int  b =  378551 ;
    unsigned int  a =  63689 ;
    unsigned int  hash =  0 ;

    while  (*str)
    {
        hash = hash * a + (*str++);
        a *= b;
    }
    return  (hash &  0x7FFFFFFF );
}

// Justin Sobel写的一个位操作的哈希函数。
unsigned int  JSHash(const char  *str)
{
    unsigned int  hash =  1315423911 ;

    while  (*str)
    {
        hash ^= ((hash << 5 ) + (*str++) + (hash >>  2 ));
    }

    return  (hash &  0x7FFFFFFF );
}

// 该散列算法是基于贝尔实验室的彼得J温伯格的的研究。
// 在Compilers一书中(原则,技术和工具),建议采用这个算法的散列函数的哈希方法。
unsigned int  PJWHash(const char  *str)
{
    unsigned int  BitsInUnignedInt = (unsigned  int )(sizeof(unsigned  int ) *  8 );
    unsigned int  ThreeQuarters  = (unsigned  int )((BitsInUnignedInt  *  3 ) /  4 );
    unsigned int  OneEighth = (unsigned  int )(BitsInUnignedInt /  8 );
    unsigned int  HighBits = (unsigned  int )( 0xFFFFFFFF ) << (BitsInUnignedInt

                                               - OneEighth);
    unsigned int  hash   =  0 ;
    unsigned int  test   =  0 ;

    while  (*str)
    {
        hash = (hash << OneEighth) + (*str++);
        if  ((test = hash & HighBits) !=  0 )
        {
            hash = ((hash ^ (test >> ThreeQuarters)) & (~HighBits));
        }
    }

    return  (hash &  0x7FFFFFFF );
}

// 和PJW很相似,在Unix系统中使用的较多。
unsigned int  ELFHash(const char  *str)
{
    unsigned int  hash =  0 ;
    unsigned int  x  =  0 ;
    while  (*str)
    {
        hash = (hash << 4 ) + (*str++);
        if  ((x = hash & 0xF0000000L) !=  0 )
        {
            hash ^= (x >> 24 );
            hash &= ~x;
        }
    }
    return  (hash &  0x7FFFFFFF );
}

// 这个算法来自Brian Kernighan 和 Dennis Ritchie的 The C Programming Language。
// 这是一个很简单的哈希算法,使用了一系列奇怪的数字,形式如31,3131,31...31,看上去和DJB算法很相似。
unsigned int  BKDRHash(const char  *str)
{
    unsigned int  seed =  131 ;  // 31 131 1313 13131 131313 etc..
    unsigned int  hash =  0 ;
    while  (*str)
    {
        hash = hash * seed + (*str++);
    }
    return  (hash &  0x7FFFFFFF );
}

// 这个算法是Daniel J.Bernstein 教授发明的,是目前公布的最有效的哈希函数。
unsigned int  DJBHash(const char  *str)
{
    unsigned int  hash =  5381 ;

    while  (*str)
    {
        hash += (hash << 5 ) + (*str++);
    }
    return  (hash &  0x7FFFFFFF );
}

// 这是本文作者Arash Partow贡献的一个哈希函数,继承了上面以旋转以为和加操作。
unsigned int  APHash(const char  *str)
{
    unsigned int  hash =  0 ;
    int  i;

    for  (i= 0 ; *str; i++)
    {
        if  ((i &  1 ) ==  0 )
        {
            hash ^= ((hash << 7 ) ^ (*str++) ^ (hash >>  3 ));
        }
        else
        {
            hash ^= (~((hash << 11 ) ^ (*str++) ^ (hash >>  5 )));
        }
    }

    return  (hash &  0x7FFFFFFF );
}

// 由伟大的Knuth在《编程的艺术 第三卷》的第六章排序和搜索中给出。
unsigned int DEKHash(const char *str)
{
      int len=strlen(str);
      unsigned int hash = len;
      for(int i = 0; i < len; i++)
      {
         hash = ((hash << 5) ^ (hash >> 27)) ^ str[i];
      }
      return hash;
}

posted on 2012-08-02 09:34  liugoodness  阅读(1250)  评论(0编辑  收藏  举报

导航