Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
p*x1+q*y1-min(p,q)=h
/* Количество элементов равно количеству чисел, участвующий в генерации хеш-функции.
Пространство хеш-функции делим пропорцинально кол-ву составляющий.
В нашему случае - 32 бита хеш-функция делится на два диапазона по 16 бит.
*/
const unsigned int P1= 70507 ;// Простое число для первого элемента.
unsigned int counter1=P1; // Счётчик для первого элемента.
unsigned int shift1=0; // Счётчик для сдвига второго числа.
const unsigned int P2= 69221;// Простое число для второго элемента.
unsigned int counter2=P2; // Счётчик для второго элемента.
unsigned int shift2=15; // Счётчик для сдвига второго элемента.
/* Возвращает хеш-функцию для любый двух чисел. */
unsigned int getHash(unsigned int n1, unsigned int n2) {
// Вычисляем первую составляющую (для первого числа).
// Циклический сдвиг суммы счётчика и значения на указанное число бит).
unsigned int v1=couter1+n1;
v1=(v1<<shift1)|(v1>>31-shift1);
counter1+=P1; // Увеличиваем счётчик для первого элемента.
shift1=(shift1+1)&31; // Увеличиваем значение сдвига первого элемента.
// Аналогично вычисляем второй элемент:
unsigned int v2=couter2+n2;
v2=(v2<<shift2)|(v2>>31-shift2);
counter2+=P2; // Увеличиваем счётчик для второго элемента.
shift2=(shift2+1)&31; // Увеличиваем значение сдвига второго элемента.
// Вычисляем и возвращаем хэш:
return v1 xor v2;
}
hash()), так что там, где у вас коллизий не было, в таблице они могут быть.
Заметки о реализации hashCode() в Java