getHashCode()
WP7のすべてのコントロール、アイテムには、一連の番号を返すメソッドがあることに気づきました。このハッシュコードを使用してアイテムを識別できますか?たとえば、デバイス内の写真や曲を特定して、どこにあるのかを確認したいのです。これは、特定のアイテムに指定されたハッシュコードが一意である場合に実行できます。
hashCodeとは何getHashCode()
ですか?
getHashCode()
WP7のすべてのコントロール、アイテムには、一連の番号を返すメソッドがあることに気づきました。このハッシュコードを使用してアイテムを識別できますか?たとえば、デバイス内の写真や曲を特定して、どこにあるのかを確認したいのです。これは、特定のアイテムに指定されたハッシュコードが一意である場合に実行できます。
hashCodeとは何getHashCode()
ですか?
回答:
ハッシュコードは、同等性テスト中にオブジェクトを識別するために使用される数値です。コレクション内のオブジェクトのインデックスとしても機能します。
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つの等しくないオブジェクトは、等しくないハッシュコード(衝突と呼ばれます)を持つことが保証されていません。
それが何であるかを学んだ後、アナロジーを介してうまくいけばより簡単な説明を書くことを考えました:
詳細については、以下をお読みください。
ハッシュコードは誰かを一意に識別しようとしていると考えてください
私は刑事で、犯罪者を探しています。彼をクルーエル氏と呼びましょう。(私が子供だったとき、彼は悪名高い殺人者でした-彼は誘拐された家に侵入し、貧しい少女を殺害し、彼女の体を投げ捨てました、そして彼はまだルーズに出ています-しかしそれは別の問題です)。Cruel氏には、海の中で彼を一意に識別するために使用できる特定の特性があります。オーストラリアには2,500万人の人々がいます。それらの1つは、残酷な氏です。どうすれば彼を見つけることができますか?
残酷な氏を識別する悪い方法
どうやらクルーエル氏は青い目をしている。オーストラリアの人口のほぼ半分も青い目をしているので、それはあまり役に立ちません。
残酷な氏を識別する良い方法
他に何が使えますか?わかっています:指紋を使用します!
利点:
上記の特性は、一般的に優れたハッシュ関数になります。
それでは、「衝突」との取り決めは何ですか?
だから私がリードを得て、クルーエル氏の指紋と一致する誰かを見つけたと想像してみてください。これは、私がクルーエル氏を見つけたということですか?
........たぶん!よく見てみないと。SHA256(ハッシュ関数)を使用していて、5人しかいない小さな町を探している場合-彼を見つけた可能性は非常に高いです。しかし、MD5(別の有名なハッシュ関数)を使用して+ 2 ^ 1000人の町で指紋を確認している場合、2人のまったく異なる人が同じ指紋を持っている可能性はかなりあります。
とにかく、これらすべての利点は何ですか?
ハッシュコードの唯一の本当の利点は、ハッシュテーブルに何かを入れたい場合-そしてハッシュテーブルでオブジェクトをすばやく検索したい場合-そして、それがハッシュコードの出番です。ハッシュテーブルで実際に物を見つけることができます。早く。これは、パフォーマンスを大幅に向上させるハックですが、精度は少し犠牲になります。
それでは、オーストラリアで容疑者が2,500万人いる人でいっぱいのハッシュテーブルがあるとします。残酷氏は、どのように我々は本当に彼を見つけることができます.....そこにどこかですぐに?私たちはそれらすべてを分類する必要があります:潜在的な一致を見つけるため、またはそうでなければ潜在的な容疑者を無罪にするため。時間がかかりすぎるので、一人一人のユニークな特徴を考慮したくないでしょう。代わりに何を使いますか?あなたはハッシュコードを使うでしょう!ハッシュコードは、2人が異なるかどうかを教えてくれます。Joe BloggsがMr Cruelではないかどうか。プリントが一致しない場合、それは間違いなく氏氏ではないことがわかります。しかし、指紋が一致する場合次に、使用したハッシュ関数に応じて、あなたがあなたの男を見つけた可能性はすでにかなり良いです。しかし、それは100%ではありません。あなたが確信できる唯一の方法はさらに調査することです:(i)彼/彼女は機会/動機を持っていました、(ii)目撃者などなど。
2つのオブジェクトが同じハッシュコード値を持っている場合にコンピューターを使用している場合は、それらが本当に等しいかどうかをさらに調査する必要があります。たとえば、整数が同じであるか、customer_idが一致するかなど、オブジェクトの高さ、重量などが同じかどうかを確認し、それらが同じかどうかを判断する必要があります。これは通常、おそらくIComparerまたはIEqualityインターフェイスを実装することによって行われます。
主な要約
したがって、基本的にハッシュコードは指紋です。
頭を上に回すには3分程度かかります。多分それが理にかなっているまでそれを数回読んでください。私はそれをすべて学ぶのに多くの悲しみを要したので、これが誰かを助けることを願っています!
これはWP7に固有のものではありません。すべての.Netオブジェクトに存在します。それは一種のあなたの説明を行いますが、それが一意であることが保証されていないので、私はあなたのアプリの一意の識別子としてそれをお勧めしません。
これは、こちらのmsdn記事からです。
https://blogs.msdn.microsoft.com/tomarcher/2006/05/10/are-hash-codes-unique/
「ハッシュコードは特定の入力に対して一意の値を生成するという人々の話を耳にしますが、実際には達成するのは困難ですが、同じ値にハッシュする2つの異なるデータ入力を見つけることは技術的に可能です。しかし、本当のハッシュアルゴリズムの有効性に関する決定要因は、生成されるハッシュコードの長さとハッシュされるデータの複雑さです。」
したがって、データサイズに適したハッシュアルゴリズムを使用するだけで、一意のハッシュコードが生成されます。