Java中HASH的算法总结

这篇文章主要介绍了Java常用HASH算法,结合实例形式总结分析了Java常用的Hash算法,包括加法hash、旋转hash、FNV算法、RS算法hash、PJW算法、ELF算法、BKDR算法、SDBM算法、DJB算法、DEK算法、AP算法等,需要的朋友可以参考下

本文实例讲述了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的算法总结的详细内容,更多请关注其它相关文章!

获致幸福的不二法门是珍视你所拥有的、遗忘你所没有的

Java中HASH的算法总结

相关文章:

你感兴趣的文章:

标签云: