转贴--Java Hash算法大全

转贴--Java Hash算法大全

/**
* Hash算法大全<br>
* 推荐使用FNV1算法
* @algorithm None
@author  Goodzzp 2006-11-20
* @lastEdit Goodzzp 2006-11-20
* @editDetail Create
*/
public   class  HashAlgorithms
{
    
/** //**
    * 加法hash
    * 
@param  key 字符串
    * 
@param  prime 一个质数
    * 
@return  hash结果
    
*/
    
public   static   int  additiveHash(String key,  int  prime)
    {
        
int  hash, i;
        
for  (hash  =  key.length(), i  =   0 ; i  <  key.length(); i ++ )
            hash 
+=  key.charAt(i);
        
return  (hash  %  prime);
    }
    
    
/** //**
    * 旋转hash
    * 
@param  key 输入字符串
    * 
@param  prime 质数
    * 
@return  hash值
    
*/
    
public   static   int  rotatingHash(String key,  int  prime)
    {
        
int  hash, i;
        
for  (hash = key.length(), i = 0 ; i < key.length();  ++ i)
            hash 
=  (hash << 4 ) ^ (hash >> 28 ) ^ key.charAt(i);
        
return  (hash  %  prime);
        
//    return (hash ^ (hash>>10) ^ (hash>>20));
    }
    
    
//  替代:
    
//  使用:hash = (hash ^ (hash>>10) ^ (hash>>20)) & mask;
    
//  替代:hash %= prime;

    
/** //**
    * MASK值,随便找一个值,最好是质数
    
*/
    
static   int  M_MASK  =   0x8765fed1 ;
    
/** //**
    * 一次一个hash
    * 
@param  key 输入字符串
    * 
@return  输出hash值
    
*/
    
public   static   int  oneByOneHash(String key)
    {
        
int    hash, i;
        
for  (hash = 0 , i = 0 ; i < key.length();  ++ i)
        {
            hash 
+=  key.charAt(i);
            hash 
+=  (hash  <<   10 );
            hash 
^=  (hash  >>   6 );
        }
        hash 
+=  (hash  <<   3 );
        hash 
^=  (hash  >>   11 );
        hash 
+=  (hash  <<   15 );
        
//    return (hash & M_MASK);
         return  hash;
    }
    
    
/** //**
    * Bernstein's hash
    * 
@param  key 输入字节数组
    * 
@param  level 初始hash常量
    * 
@return  结果hash
    
*/
    
public   static   int  bernstein(String key)
    {
        
int  hash  =   0 ;
        
int  i;
        
for  (i = 0 ; i < key.length();  ++ i) hash  =   33 * hash  +  key.charAt(i);
        
return  hash;
    }
    
    
//
     /** ///// Pearson's Hash
    // char pearson(char[]key, ub4 len, char tab[256])
    // {
    //   char hash;
    //   ub4 i;
    //   for (hash=len, i=0; i<len; ++i)
    //     hash=tab[hash^key[i]];
    //   return (hash);
    // }
    
    /*
*/////  CRC Hashing,计算crc,具体代码见其他
    
//  ub4 crc(char *key, ub4 len, ub4 mask, ub4 tab[256])
    
//  {
    
//    ub4 hash, i;
    
//    for (hash=len, i=0; i<len; ++i)
    
//      hash = (hash >> 8) ^ tab[(hash & 0xff) ^ key[i]];
    
//    return (hash & mask);
    
//  }
    
    
/** //**
    * Universal Hashing
    
*/
    
public   static   int  universal( char []key,  int  mask,  int [] tab)
    {
        
int  hash  =  key.length, i, len  =  key.length;
        
for  (i = 0 ; i < (len << 3 ); i += 8 )
        {
            
char  k  =  key[i >> 3 ];
            
if  ((k & 0x01 ==   0 ) hash  ^=  tab[i + 0 ];
            
if  ((k & 0x02 ==   0 ) hash  ^=  tab[i + 1 ];
            
if  ((k & 0x04 ==   0 ) hash  ^=  tab[i + 2 ];
            
if  ((k & 0x08 ==   0 ) hash  ^=  tab[i + 3 ];
            
if  ((k & 0x10 ==   0 ) hash  ^=  tab[i + 4 ];
            
if  ((k & 0x20 ==   0 ) hash  ^=  tab[i + 5 ];
            
if  ((k & 0x40 ==   0 ) hash  ^=  tab[i + 6 ];
            
if  ((k & 0x80 ==   0 ) hash  ^=  tab[i + 7 ];
        }
        
return  (hash  &  mask);
    }
    
    
/** //**
    * Zobrist Hashing
    
*/
    
public   static   int  zobrist(  char [] key, int  mask,  int [][] tab)
    {
        
int  hash, i;
        
for  (hash = key.length, i = 0 ; i < key.length;  ++ i)
            hash 
^=  tab[i][key[i]];
        
return  (hash  &  mask);
    }
    
    
//  LOOKUP3
    
//  见Bob Jenkins(3).c文件
    
    
//  32位FNV算法
     static   int  M_SHIFT  =   0 ;
    
/** //**
    * 32位的FNV算法
    * 
@param  data 数组
    * 
@return  int值
    
*/
    
public   static   int  FNVHash( byte [] data)
    {
        
int  hash  =  ( int ) 2166136261L ;
        
for ( byte  b : data)
            hash 
=  (hash  *   16777619 ^  b;
        
if  (M_SHIFT  ==   0 )
            
return  hash;
        
return  (hash  ^  (hash  >>  M_SHIFT))  &  M_MASK;
    }
    
/** //**
    * 改进的32位FNV算法1
    * 
@param  data 数组
    * 
@return  int值
    
*/
    
public   static   int  FNVHash1( byte [] data)
    {
        
final   int  p  =   16777619 ;
        
int  hash  =  ( int ) 2166136261L ;
        
for ( byte  b:data)
            hash 
=  (hash  ^  b)  *  p;
        hash 
+=  hash  <<   13 ;
        hash 
^=  hash  >>   7 ;
        hash 
+=  hash  <<   3 ;
        hash 
^=  hash  >>   17 ;
        hash 
+=  hash  <<   5 ;
        
return  hash;
    }
    
/** //**
    * 改进的32位FNV算法1
    * 
@param  data 字符串
    * 
@return  int值
    
*/
    
public   static   int  FNVHash1(String data)
    {
        
final   int  p  =   16777619 ;
        
int  hash  =  ( int ) 2166136261L ;
        
for ( int  i = 0 ;i < data.length();i ++ )
            hash 
=  (hash  ^  data.charAt(i))  *  p;
        hash 
+=  hash  <<   13 ;
        hash 
^=  hash  >>   7 ;
        hash 
+=  hash  <<   3 ;
        hash 
^=  hash  >>   17 ;
        hash 
+=  hash  <<   5 ;
        
return  hash;
    }
    
    
/** //**
    * Thomas Wang的算法,整数hash
    
*/
    
public   static   int  intHash( int  key)
    {
        key 
+=   ~ (key  <<   15 );
        key 
^=  (key  >>>   10 );
        key 
+=  (key  <<   3 );
        key 
^=  (key  >>>   6 );
        key 
+=   ~ (key  <<   11 );
        key 
^=  (key  >>>   16 );
        
return  key;
    }
    
/** //**
    * RS算法hash
    * 
@param  str 字符串
    
*/
    
public   static   int  RSHash(String str)
    {
        
int  b     =   378551 ;
        
int  a     =   63689 ;
        
int  hash  =   0 ;
        
        
for ( int  i  =   0 ; i  <  str.length(); i ++ )
        {
            hash 
=  hash  *  a  +  str.charAt(i);
            a    
=  a  *  b;
        }
        
        
return  (hash  &   0x7FFFFFFF );
    }
    
/** //* End Of RS Hash Function  */
    
    
/** //**
    * JS算法
    
*/
    
public   static   int  JSHash(String str)
    {
        
int  hash  =   1315423911 ;
        
        
for ( int  i  =   0 ; i  <  str.length(); i ++ )
        {
            hash 
^=  ((hash  <<   5 +  str.charAt(i)  +  (hash  >>   2 ));
        }
        
        
return  (hash  &   0x7FFFFFFF );
    }
    
/** //* End Of JS Hash Function  */
    
    
/** //**
    * PJW算法
    
*/
    
public   static   int  PJWHash(String str)
    {
        
int  BitsInUnsignedInt  =   32 ;
        
int  ThreeQuarters      =  (BitsInUnsignedInt  *   3 /   4 ;
        
int  OneEighth          =  BitsInUnsignedInt  /   8 ;
        
int  HighBits           =   0xFFFFFFFF   <<  (BitsInUnsignedInt  -  OneEighth);
        
int  hash               =   0 ;
        
int  test               =   0 ;
        
        
for ( int  i  =   0 ; i  <  str.length();i ++ )
        {
            hash 
=  (hash  <<  OneEighth)  +  str.charAt(i);
            
            
if ((test  =  hash  &  HighBits)  !=   0 )
            {
                hash 
=  (( hash  ^  (test  >>  ThreeQuarters))  &  ( ~ HighBits));
            }
        }
        
        
return  (hash  &   0x7FFFFFFF );
    }
    
/** //* End Of P. J. Weinberger Hash Function  */
    
    
/** //**
    * ELF算法
    
*/
    
public   static   int  ELFHash(String str)
    {
        
int  hash  =   0 ;
        
int  x     =   0 ;
        
        
for ( int  i  =   0 ; i  <  str.length(); i ++ )
        {
            hash 
=  (hash  <<   4 +  str.charAt(i);
            
if ((x  =  ( int )(hash  &   0xF0000000L ))  !=   0 )
            {
                hash 
^=  (x  >>   24 );
                hash 
&=   ~ x;
            }
        }
        
        
return  (hash  &   0x7FFFFFFF );
    }
    
/** //* End Of ELF Hash Function  */
    
    
/** //**
    * BKDR算法
    
*/
    
public   static   int  BKDRHash(String str)
    {
        
int  seed  =   131 //  31 131 1313 13131 131313 etc..
         int  hash  =   0 ;
        
        
for ( int  i  =   0 ; i  <  str.length(); i ++ )
        {
            hash 
=  (hash  *  seed)  +  str.charAt(i);
        }
        
        
return  (hash  &   0x7FFFFFFF );
    }
    
/** //* End Of BKDR Hash Function  */
    
    
/** //**
    * SDBM算法
    
*/
    
public   static   int  SDBMHash(String str)
    {
        
int  hash  =   0 ;
        
        
for ( int  i  =   0 ; i  <  str.length(); i ++ )
        {
            hash 
=  str.charAt(i)  +  (hash  <<   6 +  (hash  <<   16 -  hash;
        }
        
        
return  (hash  &   0x7FFFFFFF );
    }
    
/** //* End Of SDBM Hash Function  */
    
    
/** //**
    * DJB算法
    
*/
    
public   static   int  DJBHash(String str)
    {
        
int  hash  =   5381 ;
        
        
for ( int  i  =   0 ; i  <  str.length(); i ++ )
        {
            hash 
=  ((hash  <<   5 +  hash)  +  str.charAt(i);
        }
        
        
return  (hash  &   0x7FFFFFFF );
    }
    
/** //* End Of DJB Hash Function  */
    
    
/** //**
    * DEK算法
    
*/
    
public   static   int  DEKHash(String str)
    {
        
int  hash  =  str.length();
        
        
for ( int  i  =   0 ; i  <  str.length(); i ++ )
        {
            hash 
=  ((hash  <<   5 ^  (hash  >>   27 ))  ^  str.charAt(i);
        }
        
        
return  (hash  &   0x7FFFFFFF );
    }
    
/** //* End Of DEK Hash Function  */
    
    
/** //**
    * AP算法
    
*/
    
public   static   int  APHash(String str)
    {
        
int  hash  =   0 ;
        
        
for ( int  i  =   0 ; i  <  str.length(); i ++ )
        {
            hash 
^=  ((i  &   1 ==   0 ?  ( (hash  <<   7 ^  str.charAt(i)  ^  (hash  >>   3 )) :
        (
~ ((hash  <<   11 ^  str.charAt(i)  ^  (hash  >>   5 )));
        }
        
        
//        return (hash & 0x7FFFFFFF);
         return  hash;
    }
    
/** //* End Of AP Hash Function  */
    
    
/** //**
    * JAVA自己带的算法
    
*/
    
public   static   int  java(String str)
    {
        
int  h  =   0 ;
        
int  off  =   0 ;
        
int  len  =  str.length();
        
for  ( int  i  =   0 ; i  <  len; i ++ )
        {
            h 
=   31   *  h  +  str.charAt(off ++ );
        }
        
return  h;
    }
    
    
/** //**
    * 混合hash算法,输出64位的值
    
*/
    
public   static   long  mixHash(String str)
    {
        
long  hash  =  str.hashCode();
        hash 
<<=   32 ;
        hash 
|=  FNVHash1(str);
        
return  hash;
    }
}

你可能感兴趣的:(转贴--Java Hash算法大全)