У меня есть строка anna
, где значения символов в строке являются a = 1, n = 14 (You can compute the value of other chars like (char - 96)
и хэш-функция, которая выглядит как:Найти строку столкновения с заданной хеш-функции
int hashCode(string s) // s = "anna";
{
k = 0;
for (int i = 0; i < s.length(); i++)
k = (7 * k + 3 * s[i]) % 61;
return k;
}
Как найти строку длины 3 где происходит столкновение (что-то умное)? Единственный способ, который приходит мне на ум, - вычислить k
из anna
, который равен 29
, а затем как-то подумайте о другой строке длины 3, которая дает 29
.
вам придется это сделать, я боюсь, да. –
Я вижу, что _61_ является простым, и вы его модулируете. Добро пожаловать в мир [Задача дискретного логарифма] (https://en.wikipedia.org/wiki/Discrete_logarithm). – SpencerD
@ Jean-FrançoisFabre: Я бы не был так уверен, есть причина, чтобы написать хорошую одностороннюю криптографическую хэш-функцию. Тем не менее, я не специалист по криптографии или математике, поэтому я не могу сказать, как бы вы отменили это правильно, но когда вы говорите о трех строках строчных букв, вам не нужно быть умным; поисковое пространство - это только '26 ** 3 == 17,576' тотальные строки, поэтому исчерпывать их все тривиально. – ShadowRanger