Простая стратегия хеширования значения int
заключается в умножении на большую константу. Если вы не используете константу, вы можете получить очень низкие показатели коллизий в зависимости от вашего распределения ключей. По-прежнему возможно плохое распределение ключей, однако для реальных данных это менее вероятно.
ПРИМЕЧАНИЕ. Если вы не знаете, что ключ не может быть отрицательным, вы должны использовать Math.abs
, чтобы убедиться, что он неотрицательный.
static final int K = 0x7A646E4D; // some large prime.
public int getIndex(int key) {
return Math.abs(key * K % nodes.length);
}
Более быстрое решение - отказаться от использования %
, использовать умножение и сдвиг. например,
public int getIndex(int key) {
return (int) ((key * K & 0xFFFF_FFFFL) * nodes.length >>> 32);
}
Это превращает key * K
в дробь и работает быстрее, чем %