ELFhash算法的基本思想是:将一个字符串的数组中的每个元素依次按前四位与上一个元素的低四位相与,组成一个长整形,如果长整的高四位大于零,那么就将它折回再与长整的低四位相异或,这样最后得到的长整对HASH表长取余,得到在HASH中的位置。
<pre name="code" class="html">public long ELFHash(String str) {
long hash = 0;
long x = 0;
for (int i = 0; i < str.length(); i++) {
hash = (hash << 4) + str.charAt(i); // hash左移4位,当前字符ASCII存入hash低四位
// 因为下一步仍要左移4位,所以如果高4位不为0,进行下面处理,防止丢失信息
// 如果最高的四位不为0,则说明字符多余7个,如果不处理,再加第九个字符时,第一个字符会被移出,因此要有如下处理
if ((x = hash & 0xF0000000L) != 0) {
hash ^= (x >> 24); // 如果对于字符串(a-z 或者A-Z)就会仅仅影响5-8位,否则会影响5-31位
hash &= ~x; // 清除最高四位 (28-31)
}
}
// 返回一个符号位为0的数,即丢弃最高位,以免函数外产生影响。
return (hash & 0x7FFFFFFF); //
}