warunek konieczny na to, że parametr M pozwala utworzyć różnowartościową funkcję hashującą test taki, że "xi mod M" też jest różnowartościowe (łatwe do udowodnienia).
Zgadza się. Po podstawieniu do tego wzoru otrzymujemy wielokrotności
danych liczb plus a1 * a2 * a3. Jeśli liczby xi miały takie same
reszty, to ich wielokrotności też będą miały takie same reszty. Dodanie
wartości a1 * a2 * a3 wszystkie reszty przesunie tak samo.
EDIT: dowód nie jest taki prosty. Jakbyś mógł go przestawić
to będę wdzięczny.
Należałoby się teraz zastanowić, czy ten dowód w ogóle nie dyskwalifikuje
powyższego wzoru na dobrą funkcję hash.
W wersji w której bierzemy 32 lub 64 najmniej znaczące bity, powyższy
warunek konieczny nie obowiązuje. Branie ostatnich 32 lub 64 bitów nie
jest uciążliwe obliczeniowo, więc może w takiej wersji jest to dobry
wzór na funkcję hash.
Znaleźć takie minimalne M spełniające warunek konieczny nie powinno być trudne (zacząć od M=n i po kolei sprawdzać warunek konieczny).
Nie mam pomysłu jak odnaleźć a1 a2 a3 poza metodami siłowymi.
"M=max(xi)-min(xi)+1" powinno już dawać gwarnację, że istnieją takie a1 a2 a3 , że funkcja hash jest różnowartościowa.
Siłowo / losowo udawało mi się tylko dla małych zbiorów, rzędu 30 elementów.