加关注

# 秒大刀 博客

## 日志

### 字符串Hash函数

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

下载LOFTER 我的照片书  |

//  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

CRC 算法

2011-12-26

2012-8-24
评论这张

#### 评论

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