hashCodeは何に使用されますか?それはユニークですか?


129

getHashCode()WP7のすべてのコントロール、アイテムには、一連の番号を返すメソッドがあることに気づきました。このハッシュコードを使用してアイテムを識別できますか?たとえば、デバイス内の写真や曲を特定して、どこにあるのかを確認したいのです。これは、特定のアイテムに指定されたハッシュコードが一意である場合に実行できます。

hashCodeとは何getHashCode()ですか?


hashCodeの意味はわかっています。コードを何度も実行してハッシュコードを取得しようとすると、毎回同じアイテムに対して同じハッシュコードが返され、重複していないように見えますが、確かではありません。まあ、あなたが反対票を投じたくても大丈夫です、それはあなたの意見です。とにかく編集してくれてありがとう!
Nghia Nguyen

7
私はエリックリペットの読書をお勧めしますGetHashCodeメソッドのためのガイドラインやルールを、それはそれらを使用するためのルールではなく、ハッシュコードを実装するための規則に焦点を当てているが、彼らがそうであるように...、「設計により便利一つだけのために:ハッシュテーブルにオブジェクトを置く」
ブライアン

回答:


108

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インターフェイスに基づいています。

基本的に、ハッシュコードはハッシュテーブルを可能にするために存在します。
2つの等しいオブジェクトは、等しいハッシュコードを持つことが保証されています。
2つの等しくないオブジェクトは、等しくないハッシュコード(衝突と呼ばれます)を持つことが保証されていません。


3
MSDNからの引用は古くなっています。現在、MSDNは、ハッシュコードが一意でないことについてそれほど明確ではありません。
user34660

248

それが何であるかを学んだ後、アナロジーを介してうまくいけばより簡単な説明を書くことを考えました:

概要:ハッシュコードとは何ですか?

  • それは指紋です。この指紋を使用して、関心のある人々を識別できます。

詳細については、以下をお読みください。

ハッシュコードは誰かを一意に識別しようとしていると考えてください

私は刑事で、犯罪者を探しています。彼をクルーエル氏と呼びましょう。(私が子供だったとき、彼は悪名高い殺人者でした-彼は誘拐された家に侵入し、貧しい少女を殺害し、彼女の体を投げ捨てました、そして彼はまだルーズに出ています-しかしそれは別の問題です)。Cruel氏には、海の中で彼を一意に識別するために使用できる特定の特性があります。オーストラリアには2,500万人の人々がいます。それらの1つは、残酷な氏です。どうすれば彼を見つけることができますか?

残酷な氏を識別する悪い方法

どうやらクルーエル氏は青い目をしている。オーストラリアの人口のほぼ半分も青い目をしているので、それはあまり役に立ちません。

残酷な氏を識別する良い方法

他に何が使えますか?わかっています:指紋を使用します!

利点

  • 2人が同じ指紋を持つことは本当に難しい(不可能ではないが、非常にありそうもない)。
  • クルーエル氏の指紋は決して変わらない。
  • クルーエル氏の存在全体のすべての部分:彼の外見、髪の色、性格、食習慣などが(理想的には)指紋に反映されている必要があるため、兄弟(非常に似ているが同じではない)がいる場合、両方とも別の指紋持っている必要があります。この世界の2人の指紋が異なることを100%保証することはできないので、「すべき」と言います。
  • しかし、私たちは常にクルーエル氏が常に同じ指紋を持つこと、そして彼の指紋が決して変わらないことを保証できます。

上記の特性は、一般的に優れたハッシュ関数になります。

それでは、「衝突」との取り決めは何ですか?

だから私がリードを得て、クルーエル氏の指紋と一致する誰かを見つけたと想像してみてください。これは、私がクルーエル氏を見つけたということですか?

........たぶん!よく見てみないと。SHA256(ハッシュ関数)を使用していて、5人しかいない小さな町を探している場合-彼を見つけた可能性は非常に高いです。しかし、MD5(別の有名なハッシュ関数)を使用して+ 2 ^ 1000人の町で指紋を確認している場合、2人のまったく異なる人が同じ指紋を持っている可能性はかなりあります。

とにかく、これらすべての利点は何ですか?

ハッシュコードの唯一の本当の利点は、ハッシュテーブルに何かを入れたい場合-そしてハッシュテーブルでオブジェクトをすばやく検索したい場合-そして、それがハッシュコードの出番です。ハッシュテーブルで実際に物を見つけることができます。早く。これは、パフォーマンスを大幅に向上させるハックですが、精度は少し犠牲になります。

それでは、オーストラリアで容疑者が2,500万人いる人でいっぱいのハッシュテーブルがあるとします。残酷氏は、どのように我々は本当に彼を見つけることができます.....そこにどこかですぐに?私たちはそれらすべてを分類する必要があります:潜在的な一致を見つけるため、またはそうでなければ潜在的な容疑者を無罪にするため。時間がかかりすぎるので、一人一人のユニークな特徴を考慮したくないでしょう。代わりに何を使いますか?あなたはハッシュコードを使うでしょう!ハッシュコードは、2人が異なるかどうかを教えてくれます。Joe BloggsがMr Cruelではないかどうか。プリントが一致しない場合、それは間違いなく氏氏ではないことがわかります。しかし、指紋が一致する場合次に、使用したハッシュ関数に応じて、あなたがあなたの男を見つけた可能性はすでにかなり良いです。しかし、それは100%ではありません。あなたが確信できる唯一の方法はさらに調査することです:(i)彼/彼女は機会/動機を持っていました、(ii)目撃者などなど。

2つのオブジェクトが同じハッシュコード値を持っている場合にコンピューターを使用している場合は、それらが本当に等しいかどうかをさらに調査する必要があります。たとえば、整数が同じであるか、customer_idが一致するかなど、オブジェクトの高さ、重量などが同じかどうかを確認し、それらが同じかどうかを判断する必要があります。これは通常、おそらくIComparerまたはIEqualityインターフェイスを実装することによって行われます。

主な要約

したがって、基本的にハッシュコードは指紋です。

デジタル指紋-Pixabayの画像属性-https://pixabay.com/en/finger-fingerprint-security-digital-2081169/で自由に使用できます

  1. 理論的には、2つの異なる人物/オブジェクトが同じ指紋を持っている可能性があります。または言い換えれば。同じ指紋が2つある場合は、同じ人物/オブジェクトからのものである必要はありません。
  2. Buuuuuut、同じ人物/オブジェクトは常に同じ指紋を返し ます。
  3. つまり、2つのオブジェクトが異なるハッシュコードを返す場合、それらのオブジェクトが異なることを100%確実に知ることができます。

頭を上に回すには3分程度かかります。多分それが理にかなっているまでそれを数回読んでください。私はそれをすべて学ぶのに多くの悲しみを要したので、これが誰かを助けることを願っています!


1
再:MSDNのドキュメントは、私の脳細胞のいくつかを殺しました ... 私のかなりの数を自殺の端に追いやった。私が眠りに落ちたという理由だけで保存されました;)
Shwrk 2018年

最後にアスタリスクのコメントを付けて、素晴らしい説明全体を破棄しました。
WaldemarGałęzinowski2018

私はそれが好きだった!主名「Mr.Cruel!
ジョアン・ペドロ・アンドラーデマルケス

真の犯罪ファンとして、これはおそらく私の最も好きなSOの答えです...
IfElseTryCatch

11

GetHashCode()ハッシュテーブルのキーとしてのオブジェクトの使用をサポートするために使用されます。(Javaなどにも同様のものが存在します)。目標は、すべてのオブジェクトが個別のハッシュコードを返すことですが、これは完全に保証できるとは限りません。それはされて必要なもの2つの論理的に同等のオブジェクトが返されても、同じハッシュコードを。

典型的なハッシュテーブルの実装は、hashCode値から始まり、係数(したがって、値を範囲内に制限します)を取り、それを「バケット」の配列へのインデックスとして使用します。


8

これはWP7に固有のものではありません。すべての.Netオブジェクトに存在します。それは一種のあなたの説明を行いますが、それが一意であることが保証されていないので、私はあなたのアプリの一意の識別子としてそれをお勧めしません。

Object.GetHashCodeメソッド


4

これは、こちらのmsdn記事からです。

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

「ハッシュコードは特定の入力に対して一意の値を生成するという人々の話を耳にしますが、実際には達成するのは困難ですが、同じ値にハッシュする2つの異なるデータ入力を見つけることは技術的に可能です。しかし、本当のハッシュアルゴリズムの有効性に関する決定要因は、生成されるハッシュコードの長さとハッシュされるデータの複雑さです。」

したがって、データサイズに適したハッシュアルゴリズムを使用するだけで、一意のハッシュコードが生成されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.