2013-09-26 4 views
-1

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 

Запуск выше программы, и вы могли видеть, индекс таблицы отличается, когда я использую% и индекс таблицы другой, когда я использую &.

+2

Каков ваш точный вопрос? Формула, которую вы видите в википедии, всего лишь ** в одну сторону ** для определения хэш-ключа/индекса. Это не значит, что это всегда так. –

+0

@LuiggiMendoza: похоже, что в вики и один в java-коде отличается для вычисления индекса таблицы. – Shane

+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.

+0

Спасибо, Питер, я обновил свой вопрос с образца тестового кода ... можете ли вы объяснить в этом отношении. – Shane

+0

@Shane Обратите внимание на '(length -1)' где длина равна 2.;) то есть вам нужно сравнить 'hash & 15' с' hash% 16' –

Смежные вопросы