http://en.wikipedia.org/wiki/Hash_table
我正在查看wiki,以下是查找表索引的步骤。
hash = hashfunc(key) // calculate hash value.
index = hash % array_size // calculate index value through modulus.
但它似乎在Java中的表现方式却截然不同。
static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
static int indexFor(int h, int length) {
return h & (length-1);
}
计算表索引的indexFor方法似乎不同。任何人都可以对此有所了解。
更新
哈希算法可能会有相应的变化,但是我们计算表索引的方式应该是即使我没有错,但是我发现wiki和java的做法有什么冲突。
要测试的示例代码:
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class Test {
public static void main(String args[]) {
Map<String, String> m = new HashMap<String, String>();
m.put("Shane", null);
Iterator<String> itr = m.keySet().iterator();
while (itr.hasNext()) {
String key = itr.next();
int hash = hash(key.hashCode());
System.out.println("&&& used" + "table[" + (hash & 15) + "]=" + key);
System.out.println("%%% used" + "table[" + (hash % 15) + "]=" + key);
}
}
static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
}
输出:
&&& usedtable[14]=Shane
%%% usedtable[8]=Shane
运行上面的程序,当我使用%时,你可以看到表索引是不同的,当我使用&amp;时,表索引是不同的。
答案 0 :(得分:3)
但它在Java中的表现方式似乎完全不同。
实际上它们完全相同。
hash = hashfunc(key) // calculate hash value.
与
相同hash = hash(key.hashCode());
和
index = hash % array_size (assumes the hash is unsigned)
与
相同return h & (length-1);
因为长度是2的幂。