Для чего используется hashCode? Это уникально?

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

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

MSDN говорит :

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

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

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

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

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

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

Документация MSDN убила несколько моих клеток мозга. Узнав, в чем дело, я подумал избавить вас от агонии с помощью (надеюсь) более простого объяснения по аналогии, которую вы можете запомнить:

Подумайте о Hashcode, поскольку мы пытаемся однозначно идентифицировать кого-то

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

Плохие способы идентификации г-на Жестокого

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

Хорошие способы идентификации г-на Жестокого

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

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

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

Вышеуказанные характеристики обычно обеспечивают хорошие hash-функции.

Так в чем дело с «Collisions»?

Представьте себе, если я возьму на себя инициативу, и я найду кого-нибудь, кто отпечатает пальцы г-на Жоржа. Означает ли это, что я нашел г-на Крула?

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

Так в чем же польза от всего этого?

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

Поэтому в этом конкретном случае вы использовали бы hash-код, если бы вы сортировали людей (например, подозреваемых) и помещали их в хеш-таблицу. Вы бы использовали hash-код, чтобы узнать, разные ли люди. Независимо от того, является ли Joe Bloggs не мистером Жестом. Если отпечатки не совпадают, вы знаете, что это определенно НЕ Г-н Жестокий. если отпечатки пальцев совпадают, то в зависимости от используемой хеш-функции шансы уже достаточно хороши, вы нашли своего человека. Но это не 100%. Единственный способ убедиться в следующем: (i) имел ли он / ее возможность / мотив, (ii) свидетелей и т. Д. И т. Д.

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

Ключевые сведения

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

Цифровой отпечаток - атрибут изображения для Pixabay - свободно доступен для использования по адресу: https://pixabay.com/en/finger-fingerprint-security-digital-2081169/

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

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

* Разумеется, это правильно реализовано.

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

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

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

Метод Object.GetHashCode

Это из статьи msdn:

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

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

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

  • Вычислить медиану значений, хранящихся в векторе - C ++?
  • Использование транзакций или SaveChanges (false) и AcceptAllChanges ()?
  • Реализация тайм-аута функции, возвращающей значение
  • В чем разница между LayoutOptions Xamarin.Form, особенно Fill и Expand?
  • В чем смысл интерфейса ISerializable?
  • C # версия синхронизированного ключевого слова java?
  • Объединение двух списков вместе
  • Сравните два списка различий
  • Каков наилучший способ реализовать этот составной GetHashCode ()
  • remove_if для std :: map
  • Зачем следует избегать функции system () в C и C ++?
  • Давайте будем гением компьютера.