packagecom.conan;/*** Hash算法大全
* 推荐使用FNV1算法
*
* @algorithm None
*@authorGoodzzp 2006-11-20
* @lastEdit Goodzzp 2006-11-20
* @editDetail Create*/publicclassHashAlgorithms {/*** 加法hash
*
*@paramkey
* 字符串
*@paramprime
* 一个质数
*@returnhash结果*/publicstaticintadditiveHash(String key,intprime) {inthash, i;for(hash=key.length(), i=0; i
hash+=key.charAt(i);return(hash%prime);
}/*** 旋转hash
*
*@paramkey
* 输入字符串
*@paramprime
* 质数
*@returnhash值*/publicstaticintrotatingHash(String key,intprime) {inthash, i;for(hash=key.length(), i=0; 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值,随便找一个值,最好是质数*/staticintM_MASK=0x8765fed1;/*** 一次一个hash
*
*@paramkey
* 输入字符串
*@return输出hash值*/publicstaticintoneByOneHash(String key) {inthash, i;for(hash=0, i=0; i
hash+=key.charAt(i);
hash+=(hash<<10);
hash^=(hash>>6);
}
hash+=(hash<<3);
hash^=(hash>>11);
hash+=(hash<<15);//return (hash & M_MASK);returnhash;
}/*** Bernstein's hash
*
*@paramkey
* 输入字节数组
*@paramlevel
* 初始hash常量
*@return结果hash*/publicstaticintbernstein(String key) {inthash=0;inti;for(i=0; i
hash=33*hash+key.charAt(i);returnhash;
}//Pearson's Hash//char pearson(char[]key, ub4 len, char tab[256])//{//char hash;//ub4 i;//for (hash=len, i=0; i> 8) ^ tab[(hash & 0xff) ^ key[i]];//return (hash & mask);//}/*** Universal Hashing*/publicstaticintuniversal(char[] key,intmask,int[] tab) {inthash=key.length, i, len=key.length;for(i=0; 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*/publicstaticintzobrist(char[] key,intmask,int[][] tab) {inthash, i;for(hash=key.length, i=0; i
hash^=tab[i][key[i]];return(hash&mask);
}//LOOKUP3//见Bob Jenkins(3).c文件//32位FNV算法staticintM_SHIFT=0;/*** 32位的FNV算法
*
*@paramdata
* 数组
*@returnint值*/publicstaticintFNVHash(byte[] data) {inthash=(int)2166136261L;for(byteb : data)
hash=(hash*16777619)^b;if(M_SHIFT==0)returnhash;return(hash^(hash>>M_SHIFT))&M_MASK;
}/*** 改进的32位FNV算法1
*
*@paramdata
* 数组
*@returnint值*/publicstaticintFNVHash1(byte[] data) {finalintp=16777619;inthash=(int)2166136261L;for(byteb : data)
hash=(hash^b)*p;
hash+=hash<<13;
hash^=hash>>7;
hash+=hash<<3;
hash^=hash>>17;
hash+=hash<<5;returnhash;
}/*** 改进的32位FNV算法1
*
*@paramdata
* 字符串
*@returnint值*/publicstaticintFNVHash1(String data) {finalintp=16777619;inthash=(int)2166136261L;for(inti=0; i
hash=(hash^data.charAt(i))*p;
hash+=hash<<13;
hash^=hash>>7;
hash+=hash<<3;
hash^=hash>>17;
hash+=hash<<5;returnhash;
}/*** Thomas Wang的算法,整数hash*/publicstaticintintHash(intkey) {
key+=~(key<<15);
key^=(key>>>10);
key+=(key<<3);
key^=(key>>>6);
key+=~(key<<11);
key^=(key>>>16);returnkey;
}/*** RS算法hash
*
*@paramstr
* 字符串*/publicstaticintRSHash(String str) {intb=378551;inta=63689;inthash=0;for(inti=0; i
hash=hash*a+str.charAt(i);
a=a*b;
}return(hash&0x7FFFFFFF);
}/*End Of RS Hash Function*//*** JS算法*/publicstaticintJSHash(String str) {inthash=1315423911;for(inti=0; i
hash^=((hash<<5)+str.charAt(i)+(hash>>2));
}return(hash&0x7FFFFFFF);
}/*End Of JS Hash Function*//*** PJW算法*/publicstaticintPJWHash(String str) {intBitsInUnsignedInt=32;intThreeQuarters=(BitsInUnsignedInt*3)/4;intOneEighth=BitsInUnsignedInt/8;intHighBits=0xFFFFFFFF<
hash=(hash<
hash=((hash^(test>>ThreeQuarters))&(~HighBits));
}
}return(hash&0x7FFFFFFF);
}/*End Of P. J. Weinberger Hash Function*//*** ELF算法*/publicstaticintELFHash(String str) {inthash=0;intx=0;for(inti=0; 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算法*/publicstaticintBKDRHash(String str) {intseed=131;//31 131 1313 13131 131313 etc..inthash=0;for(inti=0; i
hash=(hash*seed)+str.charAt(i);
}return(hash&0x7FFFFFFF);
}/*End Of BKDR Hash Function*//*** SDBM算法*/publicstaticintSDBMHash(String str) {inthash=0;for(inti=0; i
hash=str.charAt(i)+(hash<<6)+(hash<<16)-hash;
}return(hash&0x7FFFFFFF);
}/*End Of SDBM Hash Function*//*** DJB算法*/publicstaticintDJBHash(String str) {inthash=5381;for(inti=0; i
hash=((hash<<5)+hash)+str.charAt(i);
}return(hash&0x7FFFFFFF);
}/*End Of DJB Hash Function*//*** DEK算法*/publicstaticintDEKHash(String str) {inthash=str.length();for(inti=0; i
hash=((hash<<5)^(hash>>27))^str.charAt(i);
}return(hash&0x7FFFFFFF);
}/*End Of DEK Hash Function*//*** AP算法*/publicstaticintAPHash(String str) {inthash=0;for(inti=0; i
hash^=((i&1)==0)?((hash<<7)^str.charAt(i)^(hash>>3))
: (~((hash<<11)^str.charAt(i)^(hash>>5)));
}//return (hash & 0x7FFFFFFF);returnhash;
}/*End Of AP Hash Function*//*** JAVA自己带的算法*/publicstaticintjava(String str) {inth=0;intoff=0;intlen=str.length();for(inti=0; i
h=31*h+str.charAt(off++);
}returnh;
}/*** 混合hash算法,输出64位的值*/publicstaticlongmixHash(String str) {longhash=str.hashCode();
hash<<=32;
hash|=FNVHash1(str);returnhash;
}
}