http://en.wikipedia.org/wiki/Hash_table
Я просматривал вики, и вот шаги, чтобы найти индекс таблицы.
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
Запустите указанную выше программу, и вы увидите, что индекс таблицы отличается, когда я использую%, и индекс таблицы отличается, когда я использую &.
1 ответ
Но похоже, что в 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.
(length -1)
, где длина является степенью 2;) т.е. вам нужно сравнить hash & 15
с hash % 16
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.