Maison >Java >javaDidacticiel >Résumé de l'algorithme HASH en Java

Résumé de l'algorithme HASH en Java

黄舟
黄舟original
2017-09-29 09:58:021770parcourir

Cet article présente principalement les algorithmes HASH couramment utilisés en Java, et résume et analyse les algorithmes HASH couramment utilisés en Java sous forme d'exemples, notamment le hachage d'addition, le hachage de rotation, l'algorithme FNV, le hachage de l'algorithme RS, l'algorithme PJW, ELF. algorithme, algorithme BKDR, algorithme SDBM, algorithme DJB, algorithme DEK, algorithme AP, etc. Les amis dans le besoin peuvent se référer à

Cet article décrit l'algorithme HASH couramment utilisé en Java avec des exemples. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :


/**
* 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&#39;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&#39;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;
  }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn