Один способ думать о хэше - это как отпечаток пальца человека (хеши также иногда называют отпечатками пальцев).
Вы можете "сжать" любого человека до (в значительной степени) уникального отпечатка пальца ... но вы не можете знать, кто этот человек, по одному его отпечатку пальца ... Это похоже на хэш, вы можете легко разобраться hash("abcdef") -> a1b2c3
, но, учитывая только a1b2c3
, вы не можете тривиально сообщить исходные данные.
Чтобы отменить отпечаток пальца, необходимо сравнить отпечаток с базой данных известных people->finger-prints
(если неизвестный отпечаток соответствует Person1, неизвестный отпечаток принадлежит им)
С помощью хэша вы снова должны делать то же самое - у вас есть база данных со всеми отображениями строк-> хэшей (называемая радужная таблица ). Затем вы ищите строку с хешем "a1b2c3", и он показывает, что "abcdef" был хеширован, чтобы получить это. Другой более распространенный способ - просто попробовать каждую комбинацию символов, хешировать их и сравнить (атака грубой силы 1013 *)
Наконец, хотя человеческие отпечатки пальцев «уникальны», возможно иметь два одинаковых, просто невероятно маловероятно - то же самое с хэшированием ... Некоторые алгоритмы хеширования более восприимчивы к коллизиям , чем другие .
У меня вопрос: если все хеши уникальны, я не смогу сжать что-либо в строку из 40 символов?
Теоретически хеширование - отличный метод сжатия, но распаковка невероятно непрактична, если не считать, скажем, 10 символов ASCII данных. Вы правы, вы можете сжать что угодно до строки из 40 символов, но вы не можете распаковать ее практически ( даже теоретически это немного натянуто ..)