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