2013-04-14 1 views
-2

У меня есть домашнее задание, где мне нужно создать хеш-таблицу для словаря, где пользователь может ввести слово в качестве ключа, и он будет искать и отображать значение.Клавиши таблицы Java Hash. Преобразование строковых ключей в ключи int

Однако я не знаю, как работает преобразование из строкового ключа в ключ int. Это код, который я взял из своего учебника:

public int hashVal(String key, int tableSize) 
{ 
    int hashKey= 0; 
    int temp = 0; 
    for(int i=0;i<key.length();i++) 
    { 
     temp = 37*temp+(int)key.charAt(i); 
    } 
    temp%=tableSize; 
    if (temp<0) 
    { 
     temp+=tableSize; 
    } 
    hashKey=temp; 
    return hashKey; 
} 

Объяснение или простой код были бы очень оценены.

+1

Это вычисляет хэш для строки. Расчет 'temp' не нужен, так как будет выполняться' string.hashCode() '(если вам не нужно это реализовать). Операция mod уменьшает хэш-код до хэш-индекса. Целое число может переполняться до отрицательного числа, так что обрабатывается тоже. –

ответ

0

Основная идея хэширования строк (или любого общего объекта) состоит в том, чтобы использовать все части ввода, чтобы мы получили довольно рандомизированное, а также распределенное значение.

Итак, для строки мы используем все символы в строке для вычисления значения хэша. Аналогично для объекта рекомендуется использовать все значимые поля в объекте при вычислении хеш-значения.

Java, аналогичным образом использует вариацию вашего учебника.

Вопрос: Почему в вашем учебнике используется 37? [Java аналогичным образом использует вариацию вашего учебного кода с 31 как постоянное значение]

Ответ: Использование простых чисел, по-видимому, приводит к лучшему распределению хэш-значений по всей таблице.

0

Ваш код имеет несколько увольнений. Ваш расчет хеширования - хотя и не обязательно неверный - также нестандартен. Я не уверен, что это принесет хорошее распространение, и я думаю, что ответ отрицательный.

Предлагаю две ревизии: используйте 37 * (int)key.charAt(i) + hash и избавьтесь от переменной темпа.

Это, таким образом, становится:

public static int hashVal(String s, int max) { 
    int hash = 0; 
    for(Char c : s.toCharArray()) 
     hash = Math.abs((hash + 37*(int)c) % max); 
    return hash; 
} 
+0

Измените тип возвращаемого метода. Как вы планируете использовать отрицательный хеш для представления индекса массива между 0 -> N? –

+0

Да, как отрицательный индекс хеша полезен вообще? И спасибо за ответ кстати. – Seeker

+0

@ShuaibParker Хорошо, мое плохое. Ред. Если вы просто держите его под абсолютными значениями, проблем не должно быть. – Zyerah

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