Возможный дубликат:
Почему хеш-функции используют модуль простых чисел?
Почему необходимо, чтобы размер хэш-таблицы (структуры данных) был простым?
Из того, что я понимаю, он обеспечивает более равномерное распределение, но есть ли другая причина?
Возможный дубликат:
Почему хеш-функции используют модуль простых чисел?
Почему необходимо, чтобы размер хэш-таблицы (структуры данных) был простым?
Из того, что я понимаю, он обеспечивает более равномерное распределение, но есть ли другая причина?
Единственная причина - избежать кластеризации значений в небольшое количество ковшей (да, распределение). Более равномерная распределенная хэш-таблица будет работать более последовательно.
из http://srinvis.blogspot.com/2006/07/hash-table-lengths-and-prime-numbers.html
Если предположим, что ваша функция hashCode приводит к следующим хэш-кодам среди других {x, 2x, 3x, 4x, 5x, 6x...}, то все они собираются в виде всего m кол-во ведер, где m = table_length/GreatestCommonFactor (table_length, x). (Тривиально проверить/вывести это). Теперь вы можете сделать одно из следующих действий, чтобы избежать кластеризации
Убедитесь, что вы не генерируете слишком много хэш-кодов, которые являются кратными другому хэш-коду, например, в {x, 2x, 3x, 4x, 5x, 6x...}. Но это может быть довольно сложно, если ваш hashTable должен иметь миллионы записей.
Или просто сделайте m равным table_length, сделав GreatestCommonFactor (table_length, x) равным 1, т.е. сделав table_length взаимно просты с x. И если x может быть почти любым числом, тогда убедитесь, что table_length является простым числом.
Какую бы хэш-функцию вы ни использовали, вы получаете целое число. Чтобы сопоставить это с хэш-таблицей, вы обычно mod
целое число с размером хэш-таблицы, чтобы сделать это значение меньше, чем размер таблицы для ее сопоставления.
return hashVal% tableSize
Я немного потерял с этого момента, но IIRC, если tableSize четный, все записи будут четными. Половина вашей хэш-таблицы никогда не будет заполнена.