2013-06-30 5 views
1

Не уверен, что это возможно, но в python есть функция hash(), которая берет строку или целое число и генерирует целочисленное представление [EDIT not-unique] этого ввода.Переверните функцию hash() в python

Мой вопрос (после поиска в Интернете), как изменить сгенерированное целое число обратно на исходную строку.

Спасибо.

+14

Вы не можете, и это не уникально. Вот что делает его хэш (https://en.wikipedia.org/wiki/Hash_function). – Ryan

+1

Вы не можете. Вот почему хеширование используется в криптографии. – michaelmeyer

+3

@ doukremt: Не все хеши криптографически безопасны. Функция 'hash()' в Python определенно не является. – duskwuff

ответ

1

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

4

Вы не можете, и это не уникально. Вот что делает его hash. От help(hash):

Возвращает значение хэша для объекта. Два объекта с одинаковым значением имеют одно и то же значение хэш-функции. Обратное не обязательно верно, но вероятно.

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

7

Вы can't theoretically do that, по крайней мере, не в эффективном режиме (читайте: «в разумные сроки»), даже если хэш не является криптографически безопасным.

Теперь если ваше пространство поиска достаточно мало (скажем, к примеру, если единственный возможный вход список 1000 слов), можно предварительно вычислить отсортированную таблицу всех возможных хэш (как ключ) и их соответствующие входы, и выполните поиск по этому вопросу O(log(n)).

Это, конечно, даст вам список возможных результатов, а хэши не уникальным. Теперь, опять же, если ваше пространство поиска достаточно мало, у вас могут быть только уникальные результаты для каждого входа. Но мы не можем сказать ничего уверенного в этом, если мы не знаем больше об источнике ваших данных.

+1

Конечно, в конкретном случае с маленькими целыми числами с 'hash' Python вам не нужна такая таблица поиска:' hash (12) == 12'. – Dougal

+0

, но 'hash (10 ** 2000) == 2342378340969425830' – Elazar

+0

@Dougal: Действительно. Заменен более значимым примером. Благодарю. – ereOn

0

Хеши предназначены для дорогостоящих вычислений. Как правило, единственный способ «перевернуть» их - это принудительно использовать вход, который использовался для генерации вывода.

0

Еще один момент, по которому люди не хватает, состоит не только в том, что его трудно найти строку, которая соответствует хешу, но также и там недостаточно информации для определения того, что такое строка.

Хеш (обычно) - криптографический способ преобразования заданного ввода в целое число, которое является необратимым. Однако возможно, что хеши могут столкнуться или столкнуться, что возможно в MD5. Таким образом, при таких хэширующих функциях количество различных строк, которые могут иметь хэш на одно и то же число, бесконечно, поэтому даже если бы можно было отменить (его нет), вы все равно не знаете, какая строка была оригиналом!

Смежные вопросы