A Za, A Za, Fighting...

坚信:勤能补拙

[zz] 若干字符串哈希函数

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

posted on 2010-07-28 13:19 simplyzhao 阅读(91) 评论(0)  编辑 收藏 引用 所属分类: G_其他


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2010年7月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

统计

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜