博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

查找字符串的hash算法

Posted on 2012-08-30 11:30  刘乐  阅读(209)  评论(0)    收藏  举报
unsigned int RSHash( 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 );


// JS Hash Function 
unsigned int JSHash( char   * str)
{
        unsigned int hash =   1315423911 ;
         while ( * str)
          {
                hash ^= ((hash <<   5 ) + ( * str ++ ) + (hash >>   2 ));
        } 

         return (hash &   0x7FFFFFFF );


// P. J. Weinberger Hash Function 
unsigned int PJWHash( 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 );


// ELF Hash Function 
unsigned int ELFHash( 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 );


// BKDR Hash Function 
unsigned int BKDRHash( 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 );


// SDBM Hash Function 
unsigned int SDBMHash( char   * str)
{
        unsigned int hash =   0 ;
         while ( * str)
          {
                hash = ( * str ++ ) + (hash <<   6 ) + (hash <<   16 ) - hash;
          } 

         return (hash &   0x7FFFFFFF );


// DJB Hash Function 
unsigned int DJBHash( char   * str)
{
        unsigned int hash =   5381 ;
         while ( * str)
          {
                hash += (hash <<   5 ) + ( * str ++ );
          } 

         return (hash &   0x7FFFFFFF );


// AP Hash Function 
unsigned int APHash( 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 );
}
struct hash_map_func
{
    enum
    {    // parameters for hash table
        bucket_size = 2,    // 0 < bucket_size
        min_buckets = 8
    };    // min_buckets = 2 ^^ N, 0 < N
    size_t operator()(const string& str)const
    {
        const char* p =str.c_str();
        unsigned long hash = 5381;
        int c;
        while (c = *p++)
            hash = ((hash << 5) + hash) + c; /**//* hash * 33 + c */
        return hash;
    }
    bool operator()(const string& _Keyval1, const string& _Keyval2) const
    {    // test if _Keyval1 ordered before _Keyval2
        return (gt(_Keyval1, _Keyval2));
    }
    greater<string> gt;
};