Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 428|回复: 0

[算法学习]Hash算法大全(java实现)

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-11 00:03:28 | 显示全部楼层 |阅读模式
    document.body.oncopy = function() {
                                if (window.clipboardData) {
                                    setTimeout(function() {
                                        var text = clipboardData.getData("text");
                                        if (text && text.length > 300) {
                                            text = text + "

    本文来自CSDN博客,转载请标明出处:" + location.href;
                                            clipboardData.setData("text", text);
                                        }
                                    }, 100);
                                }
                            }
                                              
         
                                function StorePage() { d = document; t = d.selection ? (d.selection.type != "None" ? d.selection.createRange().text : "") : (d.getSelection ? d.getSelection() : ""); void (keyit = window.open("http://www.365key.com/storeit.aspx?t=" + escape(d.title) + "&u=" + escape(d.location.href) + "&c=" + escape(t), "keyit", "scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes")); keyit.focus(); }
         
        Hash算法有很多很多种类。具体的可以参考之前我写的Hash算法的一些分析。本处给大家提供一个集合了很多使用的Hash算法的类,应该可以满足不少人的需要的:  
         
         
          java代码
          
          
         
         
            
         /**   
         * 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];   
         //   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];   
         //   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[key];   
            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;   
              }  
         
         
          
          
            
          
          
         
       

       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/11/11/000327578.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 07:45 , Processed in 0.296503 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表