登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

秒大刀 博客

好好学习 天天向上

 
 
 

日志

 
 
 
 

字符串Hash函数  

2007-10-05 16:55:06|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

比较经典的字符串hash就这些了吧,"ELF Hash Function" <-这个比较常用..

 

//  RS Hash Function

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   *   34 );

     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 );

}


2010-5-8
另外还有 :
    Jenkins hash 算法
        CRC 算法
        Adler 算法

2011-12-26

2012-8-24
  评论这张
 
阅读(2071)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018