Узнав, что это такое, я подумал написать более простое объяснение по аналогии:
Думайте о хэш-коде как о том, как мы пытаемся однозначно идентифицировать кого-то
Я детектив, в поисках преступника. Давайте назовем его мистер Жестокий. (Он был печально известным убийцей, когда я был ребенком - он ворвался в дом, похитил и убил бедную девушку, бросил ее тело, и он все еще на свободе - но это отдельный вопрос). У мистера Круэла есть определенные особенности, которые я могу использовать, чтобы однозначно идентифицировать его среди моря людей. У нас 25 миллионов человек в Австралии. Одним из них является мистер Жестокий. Как мы можем его найти?
Плохие способы идентификации мистера Круэла
Очевидно, у мистера Круэла голубые глаза. Это не сильно помогает, потому что почти половина населения Австралии также имеет голубые глаза.
Хорошие способы идентификации мистера Круэла
Что еще я могу использовать? Я знаю: я буду использовать отпечаток пальца!
Преимущества
- Действительно, двум людям действительно трудно иметь один и тот же отпечаток пальца (не невозможно, но крайне маловероятно).
- Отпечаток мистера Круэла никогда не изменится.
- Каждая часть всего существа мистера Круэла: его внешность, цвет волос, индивидуальность, привычки в еде и т. Д. Должны (в идеале) отражаться в его отпечатке пальца, так что если у него есть брат (который очень похож, но не тот же самый) - тогда оба должны иметь разных отпечатков пальцев. Я говорю «должен», потому что мы не можем на 100% гарантировать, что у двух людей в этом мире будут разные отпечатки пальцев.
- Но мы всегда можем гарантировать, что у мистера Круэла всегда будет один и тот же отпечаток пальца - и что его отпечаток никогда не изменится.
Приведенные выше характеристики обычно обеспечивают хорошие хэш-функции.
Так в чем же дело с «Столкновениями»?
Так что представьте, если я получу инициативу и найду кого-то, кто соответствует отпечаткам пальцев мистера Круэла. Значит ли это, что я нашел мистера Круэла?
........ возможно! Я должен присмотреться. Если я использую SHA256 (функцию хеширования) и я смотрю в маленьком городке, в котором всего 5 человек - тогда есть очень хороший шанс, что я его нашел! Но если я использую MD5 (еще одну известную функцию хеширования) и проверяю отпечатки пальцев в городе с +2 ^ 1000 человек, то вполне вероятно, что два совершенно разных человека могут иметь одинаковый отпечаток.
Так в чем же выгода всего этого?
Единственным реальным преимуществом хеш-кодов является то, что вы хотите поместить что-то в хеш-таблицу - а с помощью хеш-таблиц вы хотите быстро находить объекты - и именно здесь приходит хэш-код. Хеш-таблицы действительно быстро. Это хак, который значительно повышает производительность, но с небольшим расходом на точность.
Итак, давайте представим, что у нас есть хеш-таблица, заполненная людьми - 25 миллионов подозреваемых в Австралии. Мистер Круэл где-то там ..... Как мы можем найти его действительно быстро ? Нам нужно разобраться в них всех: найти потенциальное совпадение или иным образом оправдать потенциальных подозреваемых. Вы не хотите учитывать уникальные характеристики каждого человека, потому что это займет слишком много времени. Что бы вы использовали вместо этого? Вы бы использовали хэш-код! Хеш-код может сказать вам, если два человека разные. Джо Блэггс НЕ Мистер Жестокий. Если отпечатки не совпадают, значит, вы точно НЕ Мистер Жестокий. Но если отпечатки пальцев соответствуют , то в зависимости от используемой вами хэш-функции шансы на то, что вы нашли своего человека, уже достаточно высоки. Но это не 100%. Единственный способ убедиться в этом - это продолжить расследование: (i) имел ли он / она возможность / мотив, (ii) свидетели и т. Д. И т. Д.
Когда вы используете компьютеры , если два объекта имеют одинаковое значение хеш-кода, вам снова нужно исследовать, действительно ли они равны. например Вы должны проверить, есть ли у объектов, например, одинаковый рост, одинаковый вес и т. д., если целые числа одинаковы или если customer_id совпадает, а затем приходят к выводу, совпадают ли они. обычно это делается, возможно, путем реализации интерфейсов IComparer или IEquality.
Сводка ключей
Таким образом, в основном хеш-код - это отпечаток пальца.
- Два разных человека / объекта теоретически могут иметь одинаковые
отпечатков пальцев. Или другими словами. Если у вас два одинаковых отпечатка пальца ........., то они не обязательно должны быть получены от одного и того же человека / объекта.
- Buuuuuut, тот же человек / объект всегда будет возвращать
тот же отпечаток пальца .
- Это означает, что если два объекта возвращают разные хеш-коды, то вы на 100% уверены, что эти объекты разные.
Требуется добрых 3 минуты, чтобы обдумать вышесказанное. Возможно прочитайте это несколько раз, пока это не имеет смысла. Я надеюсь, что это кому-то поможет, потому что мне понадобилось много горя, чтобы выучить все это!