Я довольно новичок в хешировании в Java и застрял на нескольких частях. У меня есть список из 400 предметов (и хранится в списке 1,5x = 600), диапазон идентификаторов предметов которого составляет 1-10k. Я смотрел на несколько хеш-функций, и я сначала скопировал примеры в пакете, который просто использовал свертывание. Я заметил, что я получаю около 50-60% нулевых узлов, что, по-видимому, слишком много. Я также заметил, что простое изменение идентификатора на 600 приводит к снижению значения до 50%.
Моя текущая хеш-функция выглядит примерно так, и, несмотря на то, что она такая уродливая, она только уменьшает значение NULL на 1% по сравнению с простым моддингом со средней длиной списка 1,32 ...
public int getHash( int id )
{
int hash = id;
hash <<= id % 3;
hash += id << hash % 5;
/* let's go digit by digit! */
int digit;
for( digit = id % 10;
id != 0;
digit = id % 10, id /= 10 )
{
if ( digit == 0 ) /* prevent division by zero */
continue;
hash += digit * 2;
}
hash >>= 5;
return (hash % 600);
}
Какие хорошие методы для создания простых хеш-функций?