Для чего используется hashCode?Это уникально? - PullRequest
112 голосов
/ 15 сентября 2011

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

Не могли бы вы объяснить, для чего используются hashCode и getHashCode()?

Ответы [ 5 ]

187 голосов
/ 05 февраля 2016

Узнав, что это такое, я подумал написать более простое объяснение по аналогии:

Думайте о хэш-коде как о том, как мы пытаемся однозначно идентифицировать кого-то

Я детектив, в поисках преступника. Давайте назовем его мистер Жестокий. (Он был печально известным убийцей, когда я был ребенком - он ворвался в дом, похитил и убил бедную девушку, бросил ее тело, и он все еще на свободе - но это отдельный вопрос). У мистера Круэла есть определенные особенности, которые я могу использовать, чтобы однозначно идентифицировать его среди моря людей. У нас 25 миллионов человек в Австралии. Одним из них является мистер Жестокий. Как мы можем его найти?

Плохие способы идентификации мистера Круэла

Очевидно, у мистера Круэла голубые глаза. Это не сильно помогает, потому что почти половина населения Австралии также имеет голубые глаза.

Хорошие способы идентификации мистера Круэла

Что еще я могу использовать? Я знаю: я буду использовать отпечаток пальца!

Преимущества

  • Действительно, двум людям действительно трудно иметь один и тот же отпечаток пальца (не невозможно, но крайне маловероятно).
  • Отпечаток мистера Круэла никогда не изменится.
  • Каждая часть всего существа мистера Круэла: его внешность, цвет волос, индивидуальность, привычки в еде и т. Д. Должны (в идеале) отражаться в его отпечатке пальца, так что если у него есть брат (который очень похож, но не тот же самый) - тогда оба должны иметь разных отпечатков пальцев. Я говорю «должен», потому что мы не можем на 100% гарантировать, что у двух людей в этом мире будут разные отпечатки пальцев.
  • Но мы всегда можем гарантировать, что у мистера Круэла всегда будет один и тот же отпечаток пальца - и что его отпечаток никогда не изменится.

Приведенные выше характеристики обычно обеспечивают хорошие хэш-функции.

Так в чем же дело с «Столкновениями»?

Так что представьте, если я получу инициативу и найду кого-то, кто соответствует отпечаткам пальцев мистера Круэла. Значит ли это, что я нашел мистера Круэла?

........ возможно! Я должен присмотреться. Если я использую SHA256 (функцию хеширования) и я смотрю в маленьком городке, в котором всего 5 человек - тогда есть очень хороший шанс, что я его нашел! Но если я использую MD5 (еще одну известную функцию хеширования) и проверяю отпечатки пальцев в городе с +2 ^ 1000 человек, то вполне вероятно, что два совершенно разных человека могут иметь одинаковый отпечаток.

Так в чем же выгода всего этого?

Единственным реальным преимуществом хеш-кодов является то, что вы хотите поместить что-то в хеш-таблицу - а с помощью хеш-таблиц вы хотите быстро находить объекты - и именно здесь приходит хэш-код. Хеш-таблицы действительно быстро. Это хак, который значительно повышает производительность, но с небольшим расходом на точность.

Итак, давайте представим, что у нас есть хеш-таблица, заполненная людьми - 25 миллионов подозреваемых в Австралии. Мистер Круэл где-то там ..... Как мы можем найти его действительно быстро ? Нам нужно разобраться в них всех: найти потенциальное совпадение или иным образом оправдать потенциальных подозреваемых. Вы не хотите учитывать уникальные характеристики каждого человека, потому что это займет слишком много времени. Что бы вы использовали вместо этого? Вы бы использовали хэш-код! Хеш-код может сказать вам, если два человека разные. Джо Блэггс НЕ Мистер Жестокий. Если отпечатки не совпадают, значит, вы точно НЕ Мистер Жестокий. Но если отпечатки пальцев соответствуют , то в зависимости от используемой вами хэш-функции шансы на то, что вы нашли своего человека, уже достаточно высоки. Но это не 100%. Единственный способ убедиться в этом - это продолжить расследование: (i) имел ли он / она возможность / мотив, (ii) свидетели и т. Д. И т. Д.

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

Сводка ключей

Таким образом, в основном хеш-код - это отпечаток пальца.

Digital Fingerprint - Picture attribute to Pixabay - Freely available for use at: https://pixabay.com/en/finger-fingerprint-security-digital-2081169/

  1. Два разных человека / объекта теоретически могут иметь одинаковые отпечатков пальцев. Или другими словами. Если у вас два одинаковых отпечатка пальца ........., то они не обязательно должны быть получены от одного и того же человека / объекта.
  2. Buuuuuut, тот же человек / объект всегда будет возвращать тот же отпечаток пальца .
  3. Это означает, что если два объекта возвращают разные хеш-коды, то вы на 100% уверены, что эти объекты разные.

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

98 голосов
/ 15 сентября 2011

MSDN сообщает :

Хеш-код - это числовое значение, которое используется для идентификации объекта во время проверки на равенство.Он также может служить индексом для объекта в коллекции.

Метод GetHashCode подходит для использования в алгоритмах хеширования и структурах данных, таких как хеш-таблица.

Реализация по умолчанию дляМетод GetHashCode не гарантирует уникальные возвращаемые значения для разных объектов.Кроме того, .NET Framework не гарантирует реализацию по умолчанию метода GetHashCode, и возвращаемое значение будет одинаковым для разных версий .NET Framework.Следовательно, реализация по умолчанию этого метода не должна использоваться в качестве уникального идентификатора объекта для целей хеширования.

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

Объекты, используемые в качестве ключа в объекте Hashtable, также должны переопределять метод GetHashCode, поскольку эти объектыдолжен генерировать свой собственный хэш-код.Если объект, используемый в качестве ключа, не обеспечивает полезную реализацию GetHashCode, вы можете указать поставщика хеш-кода при создании объекта Hashtable.До .NET Framework версии 2.0 поставщик хеш-кода был основан на интерфейсе System.Collections.IHashCodeProvider.Начиная с версии 2.0, поставщик хеш-кода основан на интерфейсе System.Collections.IEqualityComparer.

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

11 голосов
/ 15 сентября 2011

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

Типичная реализация хеш-таблицы начинается со значения hashCode, принимает модуль (ограничивая значение в диапазоне) и использует его в качестве индекса для массива «сегментов».

8 голосов
/ 15 сентября 2011

Он не уникален для WP7 - он присутствует во всех объектах .Net.Это как бы то, что вы описываете, но я бы не рекомендовал его в качестве уникального идентификатора в ваших приложениях, поскольку он не гарантированно будет уникальным.

4 голосов
/ 16 октября 2017

Это из статьи MSDN здесь:

https://blogs.msdn.microsoft.com/tomarcher/2006/05/10/are-hash-codes-unique/

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

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

...