問題タブ [gethashcode]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - object.GetHashCode() を適切にオーバーライドする方法に関する一般的なアドバイスとガイドライン
MSDNによると、ハッシュ関数には次のプロパティが必要です。
2 つのオブジェクトを比較して等しい場合、各オブジェクトの GetHashCode メソッドは同じ値を返す必要があります。ただし、2 つのオブジェクトが等しくない場合、2 つのオブジェクトの GetHashCode メソッドは異なる値を返す必要はありません。
オブジェクトの GetHashCode メソッドは、オブジェクトの Equals メソッドの戻り値を決定するオブジェクトの状態に変更がない限り、一貫して同じハッシュ コードを返す必要があります。これはアプリケーションの現在の実行にのみ当てはまり、アプリケーションが再度実行されると別のハッシュ コードが返される可能性があることに注意してください。
最高のパフォーマンスを得るには、ハッシュ関数がすべての入力に対してランダムな分布を生成する必要があります。
私は次のシナリオで自分自身を見つけ続けています: クラスを作成し、実装IEquatable<T>
してオーバーライドしobject.Equals(object)
ました。MSDNは次のように述べています。
Equals をオーバーライドする型は、 GetHashCode もオーバーライドする必要があります。そうしないと、Hashtable が正しく機能しない可能性があります。
そして、それは通常、私にとっては少し止まります。なぜなら、どのように適切にオーバーライドするのobject.GetHashCode()
ですか? どこから始めればよいか分からず、多くの落とし穴があるようです。
ここ StackOverflow では、GetHashCode のオーバーライドに関連する質問がかなりありますが、それらのほとんどは、非常に特殊なケースや特定の問題に関するものであるようです。したがって、ここで適切なコンパイルを取得したいと思います。一般的なアドバイスとガイドラインを含む概要。何をすべきか、何をすべきでないか、よくある落とし穴、どこから始めるべきかなど。
特に C# 向けにしたいのですが、他の .NET 言語でも同じように機能すると思います (?)。
おそらく最善の方法は、トピックごとに 1 つの回答を作成し、最初に簡単で短い回答を作成し (可能であればワンライナーに近いものにする)、次にさらに情報を追加して、関連する質問、ディスカッション、ブログ投稿などで終了することだと思います。 、もしあれば。次に、「目次」だけを使用して、受け入れられた回答として (一番上に表示されるように) 1 つの投稿を作成できます。短く簡潔にするようにしてください。また、他の質問やブログ投稿へのリンクだけにしないでください。それらの本質を理解し、ソースにリンクするようにしてください (特に、ソースが消える可能性があるため)。また、非常によく似た回答をたくさん作成するのではなく、回答を編集して改善するようにしてください。
私はあまり優れたテクニカル ライターではありませんが、少なくとも回答が似ているように書式を設定したり、目次を作成したりします。また、SO で関連する質問の一部を検索して、私が扱えるもののエッセンスを引き出すかもしれません。しかし、私はこのトピックについてあまり安定していないので、ほとんどの場合、近づかないようにします :p
c# - 値オブジェクトの IEqualityComparer
IPathwayModule という不変の値オブジェクトがあり、その値は次のように定義されています。
- (整数) ブロック。
- (エンティティ) モジュール。(文字列) ModuleId で識別されます。
- (列挙) ステータス。と
- (エンティティ) (文字列) ClassId で識別されるクラス - null の場合もあります。
これは、いくつかの単体テストで機能するように見える現在の IEqualityComparer 実装です。しかし、自分が何を正しく行っているかを十分に理解しているとは思えません。以前の実装では、繰り返しテストを実行すると失敗することがありました。
IPathwayModule は間違いなく不変であり、同じ値を持つ異なるインスタンスは等しく、同じ HashCode を生成する必要があります。それらは HashSet 内の項目として使用されるためです。
私の質問は次のとおりです。
- この場合、インターフェイスを正しく使用していますか?
- 望ましい動作が見られない場合はありますか?
- 堅牢性、パフォーマンスを向上させる方法はありますか?
- 私が守っていない良い習慣はありますか?
c# - リストオブジェクトを持つクラスのGetHashCode
私はそのようなクラスを持っています:
ご覧のとおり、2つのEdge
リストが同じである場合、私は同じと見なしCycles
ます。
ここでの問題は、どのように実装するGetHashCode()
かです。
試してみEdges.GetHashCode()
ましたが、問題は、オブジェクトがList<Cycle>
同じで順序が異なる2つが、同じCycle
であっても異なると見なされることです。
c# - C#: GetHashCode の単体テストはどのように行いますか?
メソッドのテストはEquals
(私の知る限り)非常に簡単です。しかし、一体どのようにしてメソッドをテストするのGetHashCode
でしょうか?
c# - C# - オブジェクト内のリストで GetHashCode をオーバーライドする方法
UIElement の動作を変更するために「KeySet」を作成しようとしています。アイデアは、たとえば、特別な機能を作成することです。ユーザーが a を押しながら要素をクリックします。またはctrl+a。
これまでの私のアプローチでは、まず、考えられるすべての修飾子のコンテナーを作成します。単一のキーを許可するだけであれば、問題ありません。簡単な辞書を使用できます。
- ディクショナリが空の場合は、デフォルト アクションを使用します。
- エントリがある場合は、現在押されているキーに応じて使用するアクションを確認します
そして、私が貪欲でなければ、それで終わりです... もちろん、もっと欲しいです。複数のキーまたは修飾子を許可したい。そこで、辞書のキーとして使用できるラッパー クラスを作成しました。
より複雑なクラスを使用すると、明らかな問題があります。現在、2 つの異なるインスタンスが 2 つの異なるキーを作成するため、彼は私の関数を見つけることができません (理解するコードを参照してください。非常に明白です)。
今、私はこの投稿をチェックしました: GetHashCode override of object containing generic arrayは少し役に立ちました。
しかし、私の質問は、クラスの基本設計は大丈夫ですか。(リストの代わりに) 修飾子と通常のキーボード キーを格納するためにハッシュセットを使用する必要があります。もしそうなら、GetHashCode 関数はどのようになりますか?
書くコードがたくさんあることは知っていますが(退屈なハッシュ関数)、始めるにはいくつかのヒントで十分です。ここに試用版を投稿します...
ここまでのコードは、テストが明らかに失敗する...
c# - ハッシュ値のみを使用してオブジェクトを比較する組み込みの IEqualityComparer はありますか?
GetHashCode 値によって返される値によってオブジェクトを比較する組み込みの IEqualityComparer はありますか? 書くのは簡単ですが、カスタム クラスではなく提供されたクラスを使用したいと思います。
現在のコード:
.net-2.0 - .Net2.0コードに実装された.Net1.1互換のString.GetHashCodeはありますか?
String.GetHashCodeを使用してディスクに永続化するのを間違えた既存のアプリがあります。アプリを.Net2.0にアップグレードしているので、その決定が戻ってきて、私を悩ませていることがわかりました。
.Net1.1互換の文字列ハッシュアルゴリズムの.Net2.0実装について誰かが知っているかどうか知りたいです。
明らかに最善の解決策は、自分でタイムマシンを購入し、2002年に戻って、このようにハッシュコードを使用することを検討することさえ考えて、すねに身を投じることです。それはありそうにないので、私は回避策を探しています。システムにこのデータを持っている既存のユーザーがいるので、ハッシュなどを1回大きく変換することはできません。
2.0への変更に伴い、コードを更新して、もちろんMD5またはSHAを使用するようにします。
私はMonoからString.GetHashCodeソースを抽出することを検討しましたが、MonoはGPLであり、私のアプリは商用であるため、実際にはオプションではありません。GetHashCodeの契約では互換性が要求されていないため、Mono実装がMS.Net実装と互換性があるかどうかさえわかりません。
何か案は?
c# - DateTime.Now には、一意のハッシュを提供する GetHashCode の独自の実装がありますか?
MSDN の記事では、GetHashCode() の既定の実装では一意の結果が保証されないため、識別子として使用しないでください。したがって、私の質問は、DateTime.Now に一意のハッシュを提供する独自の実装があるかどうかです。助けてくれてありがとう
c# - 以前にキー コレクションから取得したキーを使用すると KeyNotFoundException が発生しますか?
上記の数行を取得したキーを使用しているにもかかわらず、何らかの理由で KeyNotFoundException を取得している次のコードがあります。これがうまくいかない状況を知っている人はいますか?私は困惑しています。ところで 'SchemaElementType は列挙型です。
c# - GetHashCode() をオーバーライドする型で Object.GetHashCode() を使用する方法
Equals() の実装/オーバーライドと GetHashCode() のオーバーライドにフィールド (Ab と Ac など) を使用して IEquatable<> を実装するクラス A があり、99% の確率ですべてが正常に動作します。クラス A は、すべてインターフェイス D から継承する階層 (クラス B、C) の一部です。それらはすべて辞書 Dictionary にまとめて格納できるため、すべてが独自のデフォルトの Equals()/GetHashCode() を持っている場合に便利です。
ただし、AI の構築中に、Ab と Ac の値を取得するために何らかの作業を行う必要がある場合があります。それが起こっている間、構築中のインスタンスへの参照を保存したいと思います。その場合、A が提供するデフォルトの Equals()/GetHashCode() オーバーライドを使用したくありません。したがって、オブジェクトの Equals()/GetHashCode() の使用を強制するための ReferenceEqualityComparer を実装することを考えていました。 :
問題は、A が Object.GetHashCode() をオーバーライドするため、(A の外部で) A のインスタンスに対して Object.GetHashCode() を呼び出すにはどうすればよいかということです。
もちろん、A が IEquatable<> を実装せず、作成した辞書に常に IEqualityComparer<> を提供する方法もありますが、別の答えを期待しています。
ありがとう