/*
*
* 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[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; }}