web-dev-qa-db-ja.com

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

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

HashCodeとgetHashCode()の用途を説明してもらえますか?

113
Nghia Nguyen

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つの等しくないオブジェクトは、not等しくないハッシュコードを持つことが保証されます(衝突と呼ばれます)。

98
SLaks

それがすべてであるものを学んだ後、私は、アナロジーを介して、できればより簡単な説明を書くことを考えました:

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

私は刑事で、犯罪者を探しています。彼をミスター・クルーエルと呼ぼう。 (私が子供の頃、彼は悪名高い殺人者でした-彼は誘houseされた家に侵入し、貧しい少女を殺し、彼女の体を捨てましたが、彼はまだゆるんでいます-それは別の問題です)。クルーエル氏は、人々の海の中で彼を一意に識別するために使用できる特定の特徴を持っています。オーストラリアには2500万人がいます。そのうちの1人はCruel氏です。どうやって彼を見つけることができますか?

クルーエル氏を識別する悪い方法

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

クルーエル氏を識別する良い方法

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

利点

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

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

では、「衝突」とは何ですか?

リードを獲得し、クルーエル氏の指紋と一致する人を見つけたらどうなるか想像してみてください。これは、Mr Cruelを見つけたという意味ですか?

........おそらく!よく見てください。 SHA256(ハッシュ関数)を使用していて、5人しかいない小さな町を探している場合、彼を見つけた可能性は非常に高いです!しかし、MD5(もう1つの有名なハッシュ関数)を使用して、+ 2 ^ 1000人の町で指紋をチェックしている場合、まったく異なる2人の人が同じ指紋を持っている可能性はかなり高くなります。

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

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

それで、オーストラリアで2500万人の容疑者である人々で満たされたハッシュテーブルがあると想像しましょう。クルーエル氏はそこにいる.....どうやって彼を見つけることができるのかquickly?潜在的な一致を見つけるか、そうでなければ潜在的な容疑者を無罪にするために、それらすべてをソートする必要があります。時間がかかりすぎるので、各人の固有の特性を考慮する必要はありません。代わりに何を使用しますか?ハッシュコードを使用します!ハッシュコードは、2人が異なるかどうかを示します。 Joe BloggsがCruel氏ではないかどうか。プリントが一致しない場合、それは間違いなくミスター・クルーエルではないことがわかります。しかし、フィンガープリントが一致する場合、使用したハッシュ関数に応じて、あなたの男性を見つけた可能性はすでにかなり高くなります。しかし、それは100%ではありません。あなたが確信できる唯一の方法は、さらに調査することです:(i)彼/彼女は機会/動機を持っていた、(ii)証人など.

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

主要な要約

基本的に、ハッシュコードは指紋です。

Digital Fingerprint - Picture attribute to Pixabay - Freely available for use at: https://pixabay.com/en/finger-fingerprint-security-digital-2081169/

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

上記のことを理解するには3分ほどかかります。おそらく、それが意味を成すまで数回読んでください。私がすべてを学ぶのに多くの悲しみがかかったので、これが誰かを助けることを願っています!

198
BKSpurgeon

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

一般的なハッシュテーブルの実装は、hashCode値で始まり、モジュラス(値を範囲内に制限する)を取り、それを「バケット」の配列へのインデックスとして使用します。

11
seand

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

Object.GetHashCodeメソッド

8
Phil Sandler

これは、msdnの記事にあります:

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

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

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

4
Shree Harsha