最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java常用HASH算法總結(jié)【經(jīng)典實例】

 更新時間:2017年09月28日 11:38:41   作者:笑對生活_展望未來  
這篇文章主要介紹了Java常用HASH算法,結(jié)合實例形式總結(jié)分析了Java常用的Hash算法,包括加法hash、旋轉(zhuǎn)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 一個質(zhì)數(shù)
  * @return hash結(jié)果
  */
  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);
  }
  /**//**
  * 旋轉(zhuǎn)hash
  * @param key 輸入字符串
  * @param prime 質(zhì)數(shù)
  * @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值,隨便找一個值,最好是質(zhì)數(shù)
  */
  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 輸入字節(jié)數(shù)組
  * @param level 初始hash常量
  * @return 結(jié)果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 數(shù)組
  * @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 數(shù)組
  * @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的算法,整數(shù)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;
  }
}

更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java字符與字符串操作技巧總結(jié)》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設(shè)計有所幫助。

相關(guān)文章

  • spring boot實現(xiàn)驗證碼功能

    spring boot實現(xiàn)驗證碼功能

    Spring Boot是由Pivotal團隊提供的全新框架,其設(shè)計目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程。這篇文章主要介紹了spring boot實現(xiàn)驗證碼功能,需要的朋友可以參考下
    2018-04-04
  • java后臺判斷客戶端是手機/PC并返回不同頁面的實例

    java后臺判斷客戶端是手機/PC并返回不同頁面的實例

    下面小編就為大家分享一篇java后臺判斷客戶端是手機/PC并返回不同頁面的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • 淺談@RequestParam(required = true)的誤區(qū)

    淺談@RequestParam(required = true)的誤區(qū)

    這篇文章主要介紹了@RequestParam(required = true)的誤區(qū),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java如何比較兩個對象并獲取不相等的字段詳解

    Java如何比較兩個對象并獲取不相等的字段詳解

    這篇文章主要給大家介紹了關(guān)于Java如何比較兩個對象并獲取不相等的字段以及JAVA判斷(獲?。﹥蓚€相同對象不同的數(shù)據(jù)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-11-11
  • springBoot系列常用注解(小結(jié))

    springBoot系列常用注解(小結(jié))

    這篇文章主要介紹了springBoot系列常用注解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java中內(nèi)部類的概念與分類詳解

    Java中內(nèi)部類的概念與分類詳解

    一個類的定義放在另一個類的內(nèi)部,這個類就叫做內(nèi)部類,下面這篇文章主要給大家介紹了關(guān)于Java中內(nèi)部類的概念與分類的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-09-09
  • Java8處理List的雙層循環(huán)問題

    Java8處理List的雙層循環(huán)問題

    這篇文章主要介紹了Java8處理List的雙層循環(huán)問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 三步輕松實現(xiàn)Java的SM2前端加密后端解密

    三步輕松實現(xiàn)Java的SM2前端加密后端解密

    SM2算法和RSA算法都是公鑰密碼算法,SM2算法是一種更先進安全的算法,在我們國家商用密碼體系中被用來替換RSA算法,這篇文章主要給大家介紹了關(guān)于如何通過三步輕松實現(xiàn)Java的SM2前端加密后端解密的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Java本地方法(JNA)詳解及常見問題

    Java本地方法(JNA)詳解及常見問題

    JNA(Java?Native?Access)是一個開源Java框架,用于無需編寫JNI代碼即可動態(tài)訪問本地系統(tǒng)庫如Windows的dll,它允許Java程序直接調(diào)用本地方法,這篇文章主要介紹了Java本地方法(JNA)詳解及常見問題,需要的朋友可以參考下
    2024-09-09
  • MyBatis-Plus?分頁不生效的解決方法

    MyBatis-Plus?分頁不生效的解決方法

    本文主要介紹了MyBatis-Plus?分頁不生效的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05

最新評論

德保县| 彭山县| 新宾| 榆社县| 大同市| 永年县| 乌苏市| 盘锦市| 仲巴县| 剑阁县| 包头市| 罗源县| 富顺县| 昌图县| 南澳县| 大理市| 北川| 东阳市| 讷河市| 济南市| 五家渠市| 扶绥县| 邵阳县| 泗水县| 鹿邑县| 三河市| 东平县| 上蔡县| 图木舒克市| 富宁县| 台北市| 海原县| 航空| 彩票| 阿勒泰市| 加查县| 潮州市| 满城县| 丰原市| 庆城县| 宁国市|