http://en.wikipedia.org/wiki/Hash_tableСуществуют различные способы расчета индекса таблицы в HashMap
Я смотрел на вики и вот шаги, чтобы найти индекс таблицы.
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, который вычисляет индекс таблицы, кажется, отличается. Может кто-нибудь добавить немного света на это.
Update:
хеширования algorithim может соответственно изменяться, но, как мы вычислим индекс таблицы должен быть, даже если я не ошибаюсь, но я вижу конфликт в том, что вики делает и то, как 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
Запуск выше программы, и вы могли видеть, индекс таблицы отличается, когда я использую% и индекс таблицы другой, когда я использую &.
Каков ваш точный вопрос? Формула, которую вы видите в википедии, всего лишь ** в одну сторону ** для определения хэш-ключа/индекса. Это не значит, что это всегда так. –
@LuiggiMendoza: похоже, что в вики и один в java-коде отличается для вычисления индекса таблицы. – Shane
И проблема в том, что ... –