Для чего используется хэш-код? Является ли он уникальным?
Я заметил, что есть getHashCode()
метод в каждом элементе управления, элементы, в WP7, которые возвращают последовательность чисел. Могу ли я использовать этот хэш-код для идентификации товара? Например, я хочу идентифицировать изображение или песню в устройстве и проверить его где-то. Это можно сделать, если хэш-код, заданный для определенных элементов, уникален.
Вы можете помочь объяснить мне, что такое хэш-код и getHashCode()
использовать?
5 ответов:
хэш-код-это числовое значение, используемое для идентификации объекта во время тестирования на равенство. Он также может служить индексом для объекта в коллекции.
метод GetHashCode подходит для использования в алгоритмах хеширования и структуры данных, такие как хэш-таблица.
реализация по умолчанию метода GetHashCode не гарантируйте уникальные возвращаемые значения для различных объектов. Кроме того, Платформа .NET Framework не гарантирует реализацию по умолчанию Метод GetHashCode, и значение, которое он возвращает, будет одинаковым между различные версии платформы .NET Framework. Следовательно, по умолчанию реализация этого метода не должна использоваться как уникальный объект идентификатор для целей хеширования.
метод GetHashCode может быть переопределен производным типом. Значение типы должны переопределить этот метод для предоставления хэш-функции, которая является соответствующий для того типа и обеспечить полезное распределение в а хэш-таблица. Для уникальности, хэш-код должен быть основан на стоимости поля или свойства экземпляра вместо статического поля или свойство.
объекты, используемые в качестве ключа в объекте Hashtable, также должны переопределять Метод GetHashCode, потому что эти объекты должны генерировать свой собственный хэш код. Если объект, используемый в качестве ключа не дает полезного реализация GetHashCode, вы можете указать хэш-код поставщик при создании объекта Hashtable. До платформы .NET Framework версия 2.0, поставщиком хэш-кода основано на Система.Коллекции.Интерфейс IHashCodeProvider. Начиная с версии 2.0, поставщик хэш-кода основан на Система.Коллекции.Интерфейс IEqualityComparer.
в основном, хэш-коды существуют, чтобы сделать хэш-таблицы возможными.
Два равных объекта гарантированно имеют одинаковые хэш-коды.
Два неравных объекта: не гарантированно имеют неравные хэш-коды (это называется столкновение).
узнав, что это такое, я подумал написать, надеюсь, более простое объяснение по аналогии:
подумайте о хэш-коде, как мы пытаемся однозначно идентифицировать кого-то
Я детектив, в поисках преступника. Назовем его Мистер жестокий. (Он был известным убийцей, когда я был ребенком - он ворвался в дом, похитил и убил бедную девушку, бросил ее тело, и он все еще на свободе-но это отдельный вопрос). Мистер Жестокий имеет определенные особенности, которые я могу использовать, чтобы однозначно идентифицировать его среди моря людей. У нас в Австралии 25 миллионов человек. Один из них-Мистер жестокий. Как мы можем его найти?
плохие способы идентификации Мистера жестокого
очевидно, у Мистера жестокого голубые глаза. Это не очень помогает, потому что почти половина населения Австралии также имеет голубые глаза.
хорошие способы идентификации г-на жестокого
Что еще я могу использовать? Я знаю: я буду использовать отпечаток пальца!
преимущества:
- это действительно очень трудно для двух человек, чтобы иметь такие же отпечатки пальцев (не невозможно, но крайне маловероятно).
- отпечаток пальца Мистера крута никогда не изменится.
- каждая отдельная часть всего существа Мистера жестокого: его внешность, цвет волос, личность, привычки в еде и т. д. должны (в идеале) отражаться в его отпечатке пальца, так что если у него есть брат (который очень похоже, но не то же самое) - тогда оба должны есть разные отпечатки пальцев. Я говорю "должен", потому что мы не можем гарантировать на 100%, что два человека в этом мире будут иметь разные отпечатки пальцев.
- но мы всегда можем гарантировать, что у Мистера жестокого всегда будет один и тот же отпечаток пальца - и что его отпечаток никогда не изменится.
вышеуказанные характеристики обычно делают для хорошего хэша функции.
Так в чем же дело с "столкновениями"?
так представьте, если я получу зацепку и найду кого-то, кто соответствует отпечаткам пальцев Мистера жестокого. Значит ли это, что я нашел Мистера жестокость?
........возможно! Я должен взглянуть поближе. Если я использую SHA256 (функция хэширования), и я ищу в маленьком городе только с 5 людьми - тогда есть очень хороший шанс, что я нашел его! Но если я использую MD5 (еще одна известная функция хэширования) и проверяю отпечатки пальцев в город с +2^1000 человек, то это довольно хорошая возможность, что два совершенно разных человека могут иметь один и тот же отпечаток.
Так в чем же польза всего этого в любом случае?
единственным реальным преимуществом хэш-кодов является то, что вы хотите поместить что - то в хэш - таблицу-и с хэш-таблицами вы хотите быстро найти объекты-и именно там появляется хэш-код. Это хак, который значительно повышает производительность, но с небольшими затратами точности.
Итак, давайте представим, что у нас есть хэш - таблица, заполненная людьми-25 миллионов подозреваемых в Австралии. Мистер жестокий где-то там..... Как мы можем найти его на самом деле быстро? Нам нужно перебрать их все: найти потенциальное совпадение или иным образом оправдать потенциальных подозреваемых. Вы бы использовали хэш-код. Хэш-код может сказать вам, если два человека разные. То ли Джо Блоггс не мистер жестокий. Если отпечатки не совпадают, то вы знаете, что это определенно не мистер жестокий. Но, если отпечатки пальцев соответствуют тогда в зависимости от хэш-функции, которую вы использовали, шансы уже довольно хорошо, что вы нашли своего человека. Но это не 100%. Единственный способ, которым вы можете быть уверены, - это дальнейшее расследование: (i) была ли у него/нее возможность/мотив, (ii) свидетели и т. д.
когда вы используете компьютеры если два объекта имеют одинаковое значение хэш-кода, то вам снова нужно исследовать, действительно ли они равный. например, вам нужно будет проверить, имеют ли объекты, например, одинаковую высоту, одинаковый вес и т. д., Если целые числа одинаковы или если customer_id совпадает, а затем прийти к выводу, являются ли они одинаковыми. это обычно делается, возможно, путем реализации интерфейсов IComparer или IEquality.
Ключевые Резюме
Так что в основном хэш-код-это отпечаток пальца.
- два разных люди / объекты теоретически могут иметь то же самое дактилоскопический. Или другими словами. Если у вас есть два отпечатка пальцев, которые являются одинаковыми.........тогда они не должны оба исходить от одного и того же человека/объекта.
- Buuuuuut, в тот же человек/объекта всегда будет возвращать тот же.
- что означает, что если два объекта возвращаются разные хэш-коды, то вы знаете для 100% уверенности, что эти объекты являются отличающийся.
хорошая 3 минут, чтобы получить вашу голову вокруг. Возможно, прочитайте его несколько раз, пока это не имеет смысла. Я надеюсь, что это поможет кому-то, потому что это заняло много горя для меня, чтобы узнать все это!
GetHashCode()
используется для поддержки использования объекта в качестве ключа для хэш-таблиц. (Аналогичная вещь в Java и т. д.). Цель состоит в том, чтобы каждый объект возвращал отдельный хэш-код, но это часто не может быть абсолютно гарантировано. Это требуются хотя эти два логически равных объекта возвращают то же самое хэш-код.типичная реализация хэш-таблицы начинается со значения хэш-кода, принимает модуль (таким образом, ограничивая значение в пределах диапазона) и использует его как индекс к массиву "ведер".
Он не является уникальным для WP7-он присутствует на всех объектах .Net. Он вроде делает то, что вы описываете, но я бы не рекомендовал его в качестве уникального идентификатора приложения, как это не быть уникальным.
Это из статьи msdn здесь:
https://blogs.msdn.microsoft.com/tomarcher/2006/05/10/are-hash-codes-unique/
" хотя вы услышите, как люди утверждают, что хэш-коды генерируют уникальное значение для данного ввода, факт в том, что, хотя это трудно сделать,технически возможно найти два разных ввода данных, которые хэшируют одно и то же значение. Однако истинные определяющие факторы, касающиеся эффективности хэша алгоритм заключается в длине сгенерированного хэш-кода и сложности хэшируемых данных."
поэтому просто используйте хэш-алгоритм, подходящий для вашего размера данных, и он будет иметь уникальные хэш-коды.