AbdelrahmanNassar Ответов: 2

Как отменить функцию хеширования.


<pre>
public int hashKey(String str){
		int sum = 0;
		int exp = 1;
		for(int i = 0; i < str.length(); i++){
			int temp = str.charAt(i) * exp;
			sum += temp;
			exp *= 26;
		}
		
		return sum % 10;
}


Что я уже пробовал:

У меня есть код выше, который дает мне хэш-ключ для слова.
&ЛТ;&ЛТ;&ЛТ; смею предположить, что код ASCII для А=1 , Б=2 , с=3 &ГТ;&ГТ;&ГТ;

например, если я вставлю слово "abc", то результат будет 214%10 = 4

Как я могу получить первую букву этого слова "abc", ничего не меняя в функции

Richard MacCutchan

Должно быть очевидно, что, учитывая число 4, Вы не можете догадаться, что это хэш "abc". Это также может быть хэш многих других строк.

2 Ответов

Рейтинг:
1

OriginalGriff

Вы не можете отменить функции хэширования: они не являются формой шифрования.
Вот почему хэши всегда имеют одинаковую длину независимо от длины входных данных: они отбрасывают информацию, чтобы сгенерировать (надеюсь) уникальное значение из входных данных.

Шифрование не делает этого: таким образом, размер зашифрованных данных является переменным и часто больше, чем входные данные - невозможно создать выход фиксированного размера из функции шифрования без заполнения его до заданной длины - и даже тогда, если входные данные превышают эту длину, все равно потребуется больше места для зашифрованной версии.

Подумайте об этом: предположим, что ваш хэш - это "сложите их все вместе и возьмите остаток, когда разделите на десять", поскольку существует только 10 возможных результатов - от 0 до 9 включительно-вы не можете сказать по результату 7, был ли вход 7, 17, [1, 6], [2, 5], или массивный набор других возможных значений.

[редактировать]
Я мысль Я написал кое-что о реверсировании гашиша ... и я это сделал: Расшифровка MD5 и SHA: почему вы не можете этого сделать[^] - очевидно, что он основан на более сложных хэшах, чем ваш, но он все еще применим и охватывает "почему" лучше, чем мои комментарии выше.
[/редактировать]


Рейтинг:
0

Patrice T

Цитата:
Как отменить функцию хеширования.

Короткий ответ: вы не можете.
По замыслу, хэш-функция не может быть обращена вспять.
Смотрите свой код, для любой строки в качестве входных данных существует только 10 различных выходных данных.
Цитата:
&ЛТ;&ЛТ;&ЛТ; смею предположить, что код ASCII для А=1 , Б=2 , с=3 &ГТ;&ГТ;&ГТ;

Между прочим, ваш код неверен , потому что a=97 , b=98, c=99.
Цитата:
Как я могу получить первую букву этого слова "abc", ничего не меняя в функции

hashKey("a") == hashKey("k") == hashKey("u") == 7

из 7, Как выбрать между "А", "К" или "у" ?


Patrice T

Хорошо, и что это значит ?