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

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

Можете ли вы объяснить мне, что такое hashCode и getHashCode() для?

Ответ 1

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.

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

Ответ 2

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

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

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

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

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

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

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

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

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

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

Итак, что такое сделка с "Collisions"?

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

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

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

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

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

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

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

Цифровой отпечаток - атрибут изображения для Pixabay - свободно доступен для использования по адресу: https://pixabay. ком/ен/палец отпечатков пальцев безопасности цифро-2081169/

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

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

Я надеюсь, что это поможет кому-то, потому что мне нужно много горя, чтобы узнать все это!

Ответ 3

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

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

Ответ 4

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

Метод Object.GetHashCode

Ответ 5

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

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

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

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