2015-12-01 3 views
0

Я пытаюсь реализовать кукушку хеширования с хэш-функций: hash1: key.hashcode()% емкости hash2: key.hashcode()/емкость емкость%Кукушка хэширования Коллизии приводят к переполнению

С бесконечным контроль цикла и повторный метод удвоения. Программа отлично работает с небольшим количеством данных, но когда данные становятся большими (около 20 тыс. Элементов), программа продолжает переписываться до тех пор, пока пропускная способность не будет переполнена.

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

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

Итак, какой хэш-метод следует использовать для предотвращения этого?

+0

Вы уверены, что ваши элементы данных уникальны? – vish4071

+0

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

+0

Хорошо, в этом случае используйте пользовательскую хэш-функцию. Что может быть вашей «способностью»? – vish4071

ответ

1

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

hashFunction1(String s){ 
    int k = 7;   //take a prime number, can be anything (I just chose 7) 
    for(int i = 0; i < s.length(); i++){ 
     k *= (23 * (int)(s.charAt(i))); 
     k %= capacity; 
    } 
} 
//23 is another randomly chosen number. 

Вы можете написать аналогичную хэш-функцию как hashFunction2, выбрав два разных простых числа. Но здесь главная проблема заключается в том, что для строк «stop» и «pots» это дает тот же хэш-код.

это так, импровизация по этой функции может быть:

hashFunction1(String s){ 
    int k = 7;   //take a prime number, can be anything (I just chose 7) 
    for(int i = 0; i < s.length(); i++){ 
     k *= (23 * (int)(s.charAt(i))); 
     k += (int)(s.charAt(i)); 
     k %= capacity; 
    } 
} 

, который позволит решить это (в большинстве случаев, если не все).

Если вы все еще находите эту функцию плохой, вместо s.charAt (i) вы можете использовать уникальное простое число, сопоставленное каждому символу, т.е. a = 3, b = 5, c = 7, d = 11 и т. д. Это должно еще больше разрешить столкновение.

EDIT:

  1. Вы используете +n, который является постоянным.
  2. 2 не является основным для использования в таких случаях. Используйте нечетное простое число, 3 работы.
+0

Это немного похоже на мою пользовательскую функцию. я использовал простое число 2. И для каждого символа, я увеличить простые N = 2; для (int i = 0; i concuagia

+0

Не похоже, есть проблемы с вашей. Я отредактирую свой ответ и задав эти вопросы, тем временем, воспользуйся моей хэш-функцией и используйте простые числа (7,23) для 1-го и (13,31) для второго. – vish4071

+0

Ницца! Кажется, теперь он работает хорошо. Но как вы справляетесь с рехашированием? Мой метод rehash просто удваивает емкость. Он работает нормально, но емкость становится очень большой, хотя коэффициент нагрузки по-прежнему довольно небольшой (около 10%). – concuagia