熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Hash算法大全(java實現)

2013-11-23 18:53:37  來源: Java核心技術 

  Hash算法有很多很多種類具體的可以參考之前我寫的Hash算法的一些分析本處給大家提供一個集合了很多使用的Hash算法的類應該可以滿足不少人的需要的
Java代碼
/**
* Hash算法大全<br>
* 推薦使用FNV算法
* @algorithm None
* @author Goodzzp
* @lastEdit Goodzzp
* @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 = keylength() i = ; i < keylength(); i++)
    hash += keycharAt(i);
   return (hash % prime);
}

  /**
* 旋轉hash
* @param key 輸入字符串
* @param prime 質數
* @return hash值
*/
public static int rotatingHash(String key int prime)
{
   int hash i;
   for (hash=keylength() i=; i<keylength(); ++i)
     hash = (hash<<)^(hash>>)^keycharAt(i);
   return (hash % prime);
//   return (hash ^ (hash>>) ^ (hash>>));
}

  // 替代
// 使用hash = (hash ^ (hash>>) ^ (hash>>)) & mask;
// 替代hash %= prime;

  /**
* MASK值隨便找一個值最好是質數
*/
static int M_MASK = xfed;
/**
* 一次一個hash
* @param key 輸入字符串
* @return 輸出hash值
*/
public static int oneByOneHash(String key)
{
   int   hash i;
   for (hash= i=; i<keylength(); ++i)
   {
     hash += keycharAt(i);
     hash += (hash << );
     hash ^= (hash >> );
   }
   hash += (hash << );
   hash ^= (hash >> );
   hash += (hash << );
//   return (hash & M_MASK);
   return hash;
}

  /**
* Bernsteins hash
* @param key 輸入字節數組
* @param level 初始hash常量
* @return 結果hash
*/
public static int bernstein(String key)
{
   int hash = ;
   int i;
   for (i=; i<keylength(); ++i) hash = *hash + keycharAt(i);
   return hash;
}

  //
//// Pearsons Hash
// char pearson(char[]key ub len char tab[])
// {
//   char hash;
//   ub i;
//   for (hash=len i=; i<len; ++i)
//     hash=tab[hash^key[i]];
//   return (hash);
// }

  //// CRC Hashing計算crc具體代碼見其他
// ub crc(char *key ub len ub mask ub tab[])
// {
//   ub hash i;
//   for (hash=len i=; i<len; ++i)
//     hash = (hash >> ) ^ tab[(hash & xff) ^ key[i]];
//   return (hash & mask);
// }

  /**
* Universal Hashing
*/
public static int universal(char[]key int mask int[] tab)
{
   int hash = keylength i len = keylength;
   for (i=; i<(len<<); i+=)
   {
     char k = key[i>>];
     if ((k&x) == ) hash ^= tab[i+];
     if ((k&x) == ) hash ^= tab[i+];
     if ((k&x) == ) hash ^= tab[i+];
     if ((k&x) == ) hash ^= tab[i+];
     if ((k&x) == ) hash ^= tab[i+];
     if ((k&x) == ) hash ^= tab[i+];
     if ((k&x) == ) hash ^= tab[i+];
     if ((k&x) == ) hash ^= tab[i+];
   }
   return (hash & mask);
}

  /**
* Zobrist Hashing
*/
public static int zobrist( char[] keyint mask int[][] tab)
{
   int hash i;
   for (hash=keylength i=; i<keylength; ++i)
     hash ^= tab[i][key[i]];
   return (hash & mask);
}

  // LOOKUP
// 見Bob Jenkins()c文件

  // 位FNV算法
static int M_SHIFT = ;
/**
* 位的FNV算法
* @param data 數組
* @return int值
*/
    public static int FNVHash(byte[] data)
    {
        int hash = (int)L;
        for(byte b : data)
            hash = (hash * ) ^ b;
        if (M_SHIFT == )
            return hash;
        return (hash ^ (hash >> M_SHIFT)) & M_MASK;
    }
    /**
     * 改進的位FNV算法
     * @param data 數組
     * @return int值
     */
    public static int FNVHash(byte[] data)
    {
        final int p = ;
        int hash = (int)L;
        for(byte b:data)
            hash = (hash ^ b) * p;
        hash += hash << ;
        hash ^= hash >> ;
        hash += hash << ;
        hash ^= hash >> ;
        hash += hash << ;
        return hash;
    }
    /**
     * 改進的位FNV算法
     * @param data 字符串
     * @return int值
     */
    public static int FNVHash(String data)
    {
        final int p = ;
        int hash = (int)L;
        for(int i=;i<datalength();i++)
            hash = (hash ^ datacharAt(i)) * p;
        hash += hash << ;
        hash ^= hash >> ;
        hash += hash << ;
        hash ^= hash >> ;
        hash += hash << ;
        return hash;
    }

  [NextPage]

  /**
     * Thomas Wang的算法整數hash
     */
    public static int intHash(int key)
    {
      key += ~(key << );
      key ^= (key >>> );
      key += (key << );
      key ^= (key >>> );
      key += ~(key << );
      key ^= (key >>> );
      return key;
    }
    /**
     * RS算法hash
     * @param str 字符串
     */
    public static int RSHash(String str)
    {
        int b    = ;
        int a    = ;
        int hash = ;

  for(int i = ; i < strlength(); i++)
       {
          hash = hash * a + strcharAt(i);
          a    = a * b;
       }

  return (hash & xFFFFFFF);
    }
    /* End Of RS Hash Function */

  /**
     * JS算法
     */
    public static int JSHash(String str)
    {
       int hash = ;

  for(int i = ; i < strlength(); i++)
       {
          hash ^= ((hash << ) + strcharAt(i) + (hash >> ));
       }

  return (hash & xFFFFFFF);
    }
    /* End Of JS Hash Function */

  /**
     * PJW算法
     */
    public static int PJWHash(String str)
    {
        int BitsInUnsignedInt = ;
        int ThreeQuarters     = (BitsInUnsignedInt * ) / ;
        int OneEighth         = BitsInUnsignedInt / ;
        int HighBits          = xFFFFFFFF << (BitsInUnsignedInt OneEighth);
        int hash              = ;
        int test              = ;

  for(int i = ; i < strlength();i++)
       {
          hash = (hash << OneEighth) + strcharAt(i);

  if((test = hash & HighBits) != )
          {
             hash = (( hash ^ (test >> ThreeQuarters)) & (~HighBits));
          }
       }

  return (hash & xFFFFFFF);
    }
    /* End Of P J Weinberger Hash Function */

  /**
     * ELF算法
     */
    public static int ELFHash(String str)
    {
        int hash = ;
        int x    = ;

  for(int i = ; i < strlength(); i++)
       {
          hash = (hash << ) + strcharAt(i);
          if((x = (int)(hash & xFL)) != )
          {
             hash ^= (x >> );
             hash &= ~x;
          }
       }

  return (hash & xFFFFFFF);
    }
    /* End Of ELF Hash Function */

  /**
     * BKDR算法
     */
    public static int BKDRHash(String str)
    {
        int seed = ; // etc
        int hash = ;

  for(int i = ; i < strlength(); i++)
       {
          hash = (hash * seed) + strcharAt(i);
       }

  return (hash & xFFFFFFF);
    }
    /* End Of BKDR Hash Function */

  /**
     * SDBM算法
     */
    public static int SDBMHash(String str)
    {
        int hash = ;

  for(int i = ; i < strlength(); i++)
       {
          hash = strcharAt(i) + (hash << ) + (hash << ) hash;
       }

  return (hash & xFFFFFFF);
    }
    /* End Of SDBM Hash Function */

  /**
     * DJB算法
     */
    public static int DJBHash(String str)
    {
       int hash = ;

  for(int i = ; i < strlength(); i++)
       {
          hash = ((hash << ) + hash) + strcharAt(i);
       }

  return (hash & xFFFFFFF);
    }
    /* End Of DJB Hash Function */

  /**
     * DEK算法
     */
    public static int DEKHash(String str)
    {
        int hash = strlength();

  for(int i = ; i < strlength(); i++)
       {
          hash = ((hash << ) ^ (hash >> )) ^ strcharAt(i);
       }

  return (hash & xFFFFFFF);
    }
    /* End Of DEK Hash Function */

  /**
     * AP算法
     */
    public static int APHash(String str)
    {
        int hash = ;

  for(int i = ; i < strlength(); i++)
       {
          hash ^= ((i & ) == ) ? ( (hash << ) ^ strcharAt(i) ^ (hash >> )) :
                                   (~((hash << ) ^ strcharAt(i) ^ (hash >> )));
       }

  //       return (hash & xFFFFFFF);
       return hash;
    }
    /* End Of AP Hash Function */

  /**
     * JAVA自己帶的算法
     */
    public static int java(String str)
{
   int h = ;
   int off = ;
   int len = strlength();
   for (int i = ; i < len; i++)
   {
    h = * h + strcharAt(off++);
   }
   return h;
}

  /**
     * 混合hash算法輸出位的值
     */
      public static long mixHash(String str)
     {
    long hash = strhashCode();
     hash <<= ;
     hash |= FNVHash(str);
    return hash;
     }
}


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25947.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.