Для чого використовується hashCode? Він унікальний?


129

Я помічаю, що getHashCode()у всіх елементах керування, елементів у WP7 є метод, який повертає послідовність числа. Чи можна використовувати цей хеш-код для ідентифікації предмета? Наприклад, я хочу визначити картинку чи пісню в пристрої та перевірити її. Це можна зробити, якщо хеш-код, вказаний для конкретних елементів, унікальний.

Чи можете ви допомогти мені пояснити, що таке хеш-код і getHashCode()для чого використовувати?


Я знаю, що означає hashCode, я намагаюся запускати свій код багато разів, щоб отримати хеш-код, і він щоразу повертає той самий хеш-код для sameitems і, здається, не дублюється, але я просто не дуже впевнений. Що ж, це нормально, якщо ви хочете спростувати, це ваша думка. Дякуємо за редагування в будь-якому випадку!
Nghia Nguyen

7
Я рекомендую прочитати Настанови та правила Еріка Ліпперта для GetHashCode , хоча це зосереджено на правилах впровадження HashCodes, а не на правилах їх використання ... оскільки вони " за дизайном корисні лише для одного: розміщення об'єкта в хеш-таблиці"
Брайан

Відповіді:


108

MSDN каже :

Хеш-код - це числове значення, яке використовується для ідентифікації об'єкта під час тестування рівності. Він також може слугувати в якості індексу для об'єкта в колекції.

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

Реалізація методу GetHashCode за замовчуванням не гарантує унікальних значень повернення для різних об'єктів. Крім того, .NET Framework не гарантує реалізацію методу GetHashCode за замовчуванням, а значення, яке воно повертає, буде однаковим для різних версій .NET Framework. Отже, реалізація цього методу за замовчуванням не повинна використовуватися як унікальний ідентифікатор об'єкта для хешування.

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

Об'єкти, що використовуються як ключ у об'єкті Hashtable, повинні також замінити метод GetHashCode, оскільки ці об'єкти повинні генерувати власний хеш-код. Якщо об'єкт, що використовується в якості ключа, не забезпечує корисну реалізацію GetHashCode, ви можете вказати постачальника хеш-коду при створенні об'єкта Hashtable. До версії 2.0 .NET Framework, постачальник хеш-коду базувався на інтерфейсі System.Collections.IHashCodeProvider. Починаючи з версії 2.0, постачальник хеш-коду базується на інтерфейсі System.Collections.IEqualityComparer.

В основному існують хеш-коди, щоб зробити хештелі можливими.
Два рівних об'єкта гарантовано мають рівні хеш-коди.
На двох неоднакових об’єктах не гарантується наявність нерівних хеш-кодів (це називається зіткненням).


3
Цитата з MSDN зараз застаріла. Тепер MSDN не настільки явний, що хеш-код не є унікальним.
користувач34660

248

Дізнавшись, про що йдеться, я подумав написати пояснення простішого пояснення за аналогією:

Резюме: Що таке хеш-код?

  • Це відбиток пальців. Ми можемо використовувати цей відбиток пальців для виявлення людей, які цікавлять вас.

Детальніше читайте нижче:

Подумайте про хеш-код, як ми намагаємось унікально ідентифікувати когось

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

Погані способи виявлення жорстокого містера

Мабуть, містер Крулий має блакитні очі. Це не дуже допомагає, оскільки майже половина населення Австралії також має блакитні очі.

Хороші способи виявлення жорстокого містера

Що ще я можу використовувати? Я знаю: я буду використовувати відбиток пальця!

Переваги :

  • Двом людям насправді важко мати однаковий відбиток пальців (не неможливо, але вкрай малоймовірно).
  • Відбиток містера Круля ніколи не зміниться.
  • Кожна частина всієї істоти містера Крулеля: його зовнішній вигляд, колір волосся, особистість, харчові звички тощо повинні (в ідеалі) відображатися в його відбитку пальців, таким чином, якщо у нього є брат (який дуже схожий, але не однаковий) - то обидва повинні мати різні відбитки пальців. Я кажу "слід", тому що ми не можемо гарантувати на 100%, що двоє людей у ​​цьому світі матимуть різні відбитки пальців.
  • Але ми завжди можемо гарантувати, що містер Cruel завжди матиме однаковий відбиток пальця - і його відбиток ніколи не зміниться.

Наведені вище характеристики, як правило, служать для хороших хеш-функцій.

То яка ж угода з «Колізіями»?

Тож уявіть, якби я взяв на себе ведучу роль і знайду когось, що відповідає пальцям пальців містера Круле. Це означає, що я знайшов містера Жорстокого?

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

То яка ж користь у всьому цьому?

Єдиною реальною перевагою хеш-кодів є те, якщо ви хочете щось помістити в хеш-таблицю - і з хеш-таблицями ви хочете швидко знайти об’єкти - і ось тут входить хеш-код. Вони дозволяють вам знайти речі в хеш-таблицях дійсно швидко. Це хак, який масово покращує продуктивність, але з невеликим рахунком точності.

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

Якщо ви користуєтесь комп’ютерами, якщо два об'єкти мають однакове значення хеш-коду, вам потрібно знову дослідити, чи справді вони рівні. наприклад, вам доведеться перевірити, чи мають об'єкти, наприклад, однакову висоту, однакову вагу тощо, чи цілі числа однакові, або якщо customer_id збігається, і тоді прийдете до висновку, чи однакові вони. це, як правило, робиться, можливо, шляхом впровадження інтерфейсів IComparer або IEquality.

Основне резюме

Тому в основному хеш-код - це відбиток пальців.

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

  1. Двоє різних людей / об'єктів теоретично все ще можуть мати однаковий відбиток пальців. Або іншими словами. Якщо у вас два відбитки пальців, які однакові ........., вони не потребують обох походження від однієї людини / об'єкта.
  2. Buuuuuut, та сама людина / об'єкт завжди повертатиме той самий відбиток пальця .
  3. Що означає, що якщо два об’єкти повертають різні хеш-коди, то ви на 100% знаєте, що ці об’єкти різні.

Потрібно пройти 3 хвилини, щоб обернути голову. Можливо, прочитайте його кілька разів, поки це не має сенсу. Я сподіваюся, що це комусь допомагає, бо мені знадобилося багато горя, щоб все це навчитися!


1
Re: Документація MSDN вбила декілька моїх клітин мозку .... загнала досить багато моїх на край самогубства. врятовано лише тому, що я заснув;)
Shwrk

Ви знищили ціле ваше приємне пояснення цим коментарем зірочки в кінці.
Waldemar Gałęzinowski

Я любив це! головним чином назва "Mr.Cruel!
Жоао Педро Андраде Маркес

Як справжній фанат злочинів, це, можливо, моя найулюбленіша відповідь ТА ... будь-коли.
IfElseTryCatch

11

GetHashCode()використовується для підтримки підтримки використання об'єкта як ключа для хеш-таблиць. (Схожа річ існує в Java тощо). Мета полягає в тому, щоб кожен об’єкт повернув чіткий хеш-код, але це часто не може бути абсолютно гарантованим. Це потрібно , однак , що два логічно рівні об'єкти повертати ж хеш - код.

Типова реалізація хеш-таблиці починається зі значення хеш-коду, приймає модуль (таким чином обмежуючи значення в межах діапазону) і використовує його в якості індексу для масиву "відра".


8

Він не є унікальним для WP7 - він присутній на всіх об'єктах .Net. Це на зразок того, що ви описуєте, але я б не рекомендував це як унікальний ідентифікатор у ваших програмах, оскільки він не гарантовано є унікальним.

Метод Object.GetHashCode


4

Це з статті msdn тут:

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

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.