java Hash算法大全.docx
《java Hash算法大全.docx》由会员分享,可在线阅读,更多相关《java Hash算法大全.docx(11页珍藏版)》请在冰豆网上搜索。
![java Hash算法大全.docx](https://file1.bdocx.com/fileroot1/2023-5/15/e1e3bd81-7c3d-4af3-a3b4-bddd957ab11b/e1e3bd81-7c3d-4af3-a3b4-bddd957ab11b1.gif)
javaHash算法大全
javaHash算法大全
Java代码
/**
*Hash算法大全
*推荐使用FNV1算法
*@algorithmNone
*@authorGoodzzp2006-11-20
*@lastEditGoodzzp2006-11-20
*@editDetailCreate
*/
publicclassHashAlgorithms
{
/**//**
*加法hash
*@paramkey字符串
*@paramprime一个质数
*@returnhash结果
*/
publicstaticintadditiveHash(Stringkey,intprime)
{
inthash,i;
for(hash=key.length(),i=0;ihash+=key.charAt(i);
return(hash%prime);
}
/**//**
*旋转hash
*@paramkey输入字符串
*@paramprime质数
*@returnhash值
*/
publicstaticintrotatingHash(Stringkey,intprime)
{
inthash,i;
for(hash=key.length(),i=0;ihash=(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(Stringkey)
{
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'shash
*@paramkey输入字节数组
*@paramlevel初始hash常量
*@return结果hash
*/
publicstaticintbernstein(Stringkey)
{
inthash=0;
inti;
for(i=0;ireturnhash;
}
//
/**/////Pearson'sHash
//charpearson(char[]key,ub4len,chartab[256])
//{
//charhash;
//ub4i;
//for(hash=len,i=0;i//hash=tab[hash^key[i]];
//return(hash);
//}
/**/////CRCHashing,计算crc,具体代码见其他
//ub4crc(char*key,ub4len,ub4mask,ub4tab[256])
//{
//ub4hash,i;
//for(hash=len,i=0;i//hash=(hash>>8)^tab[(hash&0xff)^key[i]];
//return(hash&mask);
//}
/**//**
*UniversalHashing
*/
publicstaticintuniversal(char[]key,intmask,int[]tab)
{
inthash=key.length,i,len=key.length;
for(i=0;i<(len<<3);i+=8)
{
chark=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);
}
/**//**
*ZobristHashing
*/
publicstaticintzobrist(char[]key,intmask,int[][]tab)
{
inthash,i;
for(hash=key.length,i=0;ihash^=tab[i][key[i]];
return(hash&mask);
}
//LOOKUP3
//见BobJenkins(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(Stringdata)
{
finalintp=16777619;
inthash=(int)2166136261L;
for(inti=0;ihash=(hash^data.charAt(i))*p;
hash+=hash<<13;
hash^=hash>>7;
hash+=hash<<3;
hash^=hash>>17;
hash+=hash<<5;
returnhash;
}
/**//**
*ThomasWang的算法,整数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(Stringstr)
{
intb=378551;
inta=63689;
inthash=0;
for(inti=0;i{
hash=hash*a+str.charAt(i);
a=a*b;
}
return(hash&0x7FFFFFFF);
}
/**//*EndOfRSHashFunction*/
/**//**
*JS算法
*/
publicstaticintJSHash(Stringstr)
{
inthash=1315423911;
for(inti=0;i{
hash^=((hash<<5)+str.charAt(i)+(hash>>2));
}
return(hash&0x7FFFFFFF);
}
/**//*EndOfJSHashFunction*/
/**//**
*PJW算法
*/
publicstaticintPJWHash(Stringstr)
{
intBitsInUnsignedInt=32;
intThreeQuarters=(BitsInUnsignedInt*3)/4;
intOneEighth=BitsInUnsignedInt/8;
intHighBits=0xFFFFFFFF<<(BitsInUnsignedInt-OneEighth);
inthash=0;
inttest=0;
for(inti=0;i{
hash=(hash<if((test=hash&HighBits)!
=0)
{
hash=((hash^(test>>ThreeQuarters))&(~HighBits));
}
}
return(hash&0x7FFFFFFF);
}
/**//*EndOfP.J.WeinbergerHashFunction*/
/**//**
*ELF算法
*/
publicstaticintELFHash(Stringstr)
{
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);
}
/**//*EndOfELFHashFunction*/
/**//**
*BKDR算法
*/
publicstaticintBKDRHash(Stringstr)
{
intseed=131;//31131131313131131313etc..
inthash=0;
for(inti=0;i{
hash=(hash*seed)+str.charAt(i);
}
return(hash&0x7FFFFFFF);
}
/**//*EndOfBKDRHashFunction*/
/**//**
*SDBM算法
*/
publicstaticintSDBMHash(Stringstr)
{
inthash=0;
for(inti=0;i{
hash=str.charAt(i)+(hash<<6)+(hash<<16)-hash;
}
return(hash&0x7FFFFFFF);
}
/**//*EndOfSDBMHashFunction*/
/**//**
*DJB算法
*/
publicstaticintDJBHash(Stringstr)
{
inthash=5381;
for(inti=0;i{
hash=((hash<<5)+hash)+str.charAt(i);
}
return(hash&0x7FFFFFFF);
}
/**//*EndOfDJBHashFunction*/
/**//**
*DEK算法
*/
publicstaticintDEKHash(Stringstr)
{
inthash=str.length();
for(inti=0;i{
hash=((hash<<5)^(hash>>27))^str.charAt(i);
}
return(hash&0x7FFFFFFF);
}
/**//*EndOfDEKHashFunction*/
/**//**
*AP算法
*/
publicstaticintAPHash(Stringstr)
{
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;
}
/**//*EndOfAPHashFunction*/
/**//**
*JAVA自己带的算法
*/
publicstaticintjava(Stringstr)
{
inth=0;
intoff=0;
intlen=str.length();
for(inti=0;i{
h=31*h+str.charAt(off++);
}
returnh;
}
/**//**
*混合hash算法,输出64位的值
*/
publicstaticlongmixHash(Stringstr)
{
longhash=str.hashCode();
hash<<=32;
hash|=FNVHash1(str);
returnhash;
}
}