Как сделать устойчивее полиноминальное хеширование?

На codeforces взламывают решения с полиноминальными хешами.

А как написать, чтобы не взломали?
  • Вопрос задан
  • 2540 просмотров
Решения вопроса 1
barmaley_exe
@barmaley_exe
Как пишут тут,
Хеши должны быть с рандомизированным множителем/модулем, и модуль должен быть простым, иначе рано или поздно вас поймают!
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@BogolyubskiyAlexey
Во первых, модуль P должен быть простым.
Объяснение: H mod P = a, если P - простое, то мы получаем полное количество вычетов - количество различных значений A будет равно P (0...P-1). Если P - составное, то будут коллизии. Это следует из теоремы Эйлера.
В статье говорится как взламываются хэши с P = 2^64, которое явно не простое :)
В вторых, чем больше P, тем лучше, т.к. больше значений хэшей. Обычно берут (10^9)+7
В олимпиадном программировании этого хватает.

В третьих (не для олимпиад), можно дублировать вычисления хэшей для нескольких модулей P1,P2,P3
Вероятность что все три хэша дадут коллизию практически невероятна, но возможна.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы