問題タブ [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# - ジェネリック IEqualityComparerおよびGetHashCode
多くの IEqualityComparers の実装にやや怠惰であり、比較対象のオブジェクトのクラス実装を簡単に編集できないことを考えると、Distinct() および Except() 拡張メソッドで使用することを意図した次の方法を使用しました。:
いいように思えますが、本当に必要なたびにハッシュ関数を与えることはありますか? オブジェクトをバケットに入れるためにハッシュコードが使用されることを理解しています。異なるバケット、オブジェクトは等しくなく、equal は呼び出されません。
GetHashCode が同じ値を返す場合、equals が呼び出されます。( from : Equals メソッドがオーバーライドされたときに GetHashCode をオーバーライドすることが重要なのはなぜですか? )
では、たとえば (多くのプログラマーが恐怖で叫んでいるのを聞いています)、 GetHashCode が定数を返し、 Equal の呼び出しを強制する場合、何が問題になる可能性がありますか?
.net - オブジェクトを比較するときの Equals と GetHashCode
カスタム クラス インスタンスの比較を実装する場合、Equals
とプロパティの両方をオーバーライドする必要がありますか?GetHashCode
次のコードには、クラスのコレクションがあります。クラスは、クラスA
によって比較されます。ID
B
Code
出力は次のとおりです。
コメントされた場合、Code = "one B+"
出力は
ここで、比較に影響がないように思われる場合Equals
、クラスで何をオーバーライドする必要があるかを自問します。B
そのような比較にはGetHasCode()
オーバーライドで十分ですか?
c# - ハッシュコードを使用してオブジェクトを参照していますか?
詳細と言うオブジェクトを作成しました。次に割り当てます: int x = details.GetHashCode();
プログラムの後半で、整数 x を使用してこのオブジェクトにアクセスしたいと思います。C#でこれを行う方法はありますか?
どうもありがとう
ポール
c# - GetHashCode() はサーバーごとに異なる結果を返しますか?
私はそのようにコードのC#行を宣言しました
私のコンピューター、職場のコンピューター、および友人のコンピューターでは、結果は 1657858284 でした。開発サーバーでは、結果は 1548091822 でした。どのサーバーにありますか?
more notes 最初に、バージョンに違いがあることに気付きました... 1657858284 の結果は .NET 3.5 と .NET 4.0 のものでした。1548091822 は .NET 2.0 からのものです。
次に、Visual Studio 2010 にプロジェクトを .net 2.0 プロジェクトとしてコンパイルするように指示しましたが、それでも 1657858284 が返されました。
c# - 同等の内容が等しく、挿入の順序に関係なく同じハッシュ コードを返す Dictionary の実装
2 つのインスタンスが与えられ、それぞれが同じ内容を持ち、任意の順序で挿入できるDictionary<long, string>
コレクションを使用する必要があります。d1
d2
KeyValuePair<long, string>
(d1 == d2)
に評価されますtrue
d1.GetHashCode()
==d2.GetHashCode()
最初の要件はSortedDictionary
、通常の の代わりに を使用することで最も簡単に達成できましたDictionary
。
2 番目の要件が必要なのは、保存する必要がある 1 つのポイントがあるためですDictionary<Dictionary<long, string>, List<string>
。メインのDictionary
型は別のキーとして使用されDictionary
、HashCodes が同一の内容に基づいて評価されない場合、使用は希望どおりに機能しませんContainsKey()
。 (つまりd1
、 をキーとして辞書に挿入されたアイテムが既に存在する場合は、dictionary.ContainsKey(d2)
と評価される必要がありtrue
ます。
これを実現するために、新しいオブジェクトを作成しclass ComparableDictionary : SortedDictionary<long, string>
、次のものを含めました。
私の単体テストでは、これは等価性とハッシュコードの両方の基準を満たしています。ただし、GetHashCode のガイドラインとルールを読んでいると、次のことに気付きました。
規則: GetHashCode によって返される整数は、オブジェクトがハッシュ コードが安定していることに依存するデータ構造に含まれている間、決して変更してはなりません。
危険ではありますが、オブジェクトのフィールドが変化するにつれてハッシュ コード値が変化する可能性があるオブジェクトを作成することは許容されます。そのようなオブジェクトがあり、それをハッシュテーブルに入れる場合、オブジェクトを変更するコードとハッシュテーブルを維持するコードには、オブジェクトが存在している間に変更されないことを保証する合意されたプロトコルが必要です。ハッシュテーブル。そのプロトコルがどのように見えるかはあなた次第です。
オブジェクトのハッシュ コードがハッシュ テーブル内にある間に変化する可能性がある場合、明らかに、Contains メソッドは機能しなくなります。オブジェクトをバケット #5 に入れ、それを変更します。セットに変更されたオブジェクトが含まれているかどうかを尋ねると、セットはバケット #74 を探しますが、見つかりません。
オブジェクトは、予期しない方法でハッシュ テーブルに配置される可能性があることを覚えておいてください。多くの LINQ シーケンス演算子は、ハッシュ テーブルを内部的に使用します。オブジェクトを返す LINQ クエリを列挙しているときに、危険なほどオブジェクトを変更しないでください。
現在、 は、すべてのコレクションDictionary<ComparableDictionary, List<String>>
の内容を設定する必要がある場所で、コード内で 1 回だけ使用されます。ComparableDictionary
したがって、これらのガイドラインによれば、私が行ったように (完全に辞書の内容に基づいて)オーバーライドすることは許容されると思います。GetHashCode
その紹介の後、私の質問は次のとおりです。
SortedDictionary
に比べてのパフォーマンスが非常に悪いことはわかっていますDictionary
(そして、何百ものオブジェクトのインスタンス化を行うことができます)。使用する唯一の理由SortedDictionary
は、挿入の順序に関係なく、辞書の内容に基づいて等価比較を機能させるためです。を使用せずにこの平等要件を達成するためのより良い方法はありSortedDictionary
ますか?- の実装は
GetHashCode
要件に基づいて受け入れられますか? 変更可能なコンテンツに基づいていますが、それが使用されている場所はコンテンツが設定された後 (だと思います) だけなので、それはリスクをもたらすべきではないと思います。
注Dictionary
:またはを使用してこれらを設定している間SortedDictionary
、私はこれらのコレクション型に執着していません。主な必要性は、値のペアを格納できるコレクションであり、上記で定義された等価性とハッシュの要件を満たします。
nhibernate - nhibernateのgethashcodeの動作
私はこの3日間、少なくとも私にとってはおかしな行動に苦しんでいます。基本的な概念は次のとおりです。オブジェクトはメモリ内に作成され、このオブジェクトには子のリストがあります。このオブジェクトはDBに保存され、子もカスケードモードで保存されます。これは正常に機能しますが、保存後に1つの子を削除しようとして、リストから削除しようとすると、これは機能せず、リストは子を削除しません。私が見つけたのは、リスト、HashedSet
タイプ、オブジェクトが最初にリストに挿入されたとき、保存前、保存後、同じオブジェクトが同じハッシュコードを持っていないときに、どういうわけかオブジェクトのハッシュコードをキャッシュすることです。ただし、リストは引き続き古いハッシュコードを想定しています。私はとを上書きしました、たくさんのグーグルと読書の後、私はブログ投稿を見つけGetHashCode
ましたEquals
これは、nhibernateがGetHashCode
andEquals
メソッドを使用する方法を説明しています。
これは私の実装です
最初のハッシュコードが生成される前にハッシュコードを返すorgHashCodeという変数を使用しました。このメソッドを使用すると、機能するように見えますが、これは最善の解決策ではないと思います。ハッシュコードは現在のオブジェクトに対して生成されるべきであり、それの「最初のバージョン」のために。
私の説明が十分に明確であるかどうかはわかりません。ヒントをいただければ幸いです。ありがとう
.net - Equals()ではなくGetHashCode()を使用するのはなぜですか?
HashSet<T>.Add
まず、の結果を比較しますGetHashCode
。それらが等しい場合は、を呼び出しますEquals
。
さて、私の理解は、実装するために、オブジェクトのフィールドで何かをしなければならないということGetHashCode
です。簡単な実装例は、オーバーライドされたSystem.Object.GetHashCodeに最適なアルゴリズムは何ですか?にあります。。
ランダムデータで満たされた1.000.000ペアのオブジェクトの両方を比較する私のテストでは、パフォーマンスは2つの間でほぼ同等です。GetHashCode
リンクされた例のように実装され、すべてのフィールドEquals
を呼び出すだけです。Equals
では、なぜ使いすぎGetHashCode
たのEquals
でしょうか。
linq - LinqUnion-IEqualityComparerと実行数
興味深いことに、IEqualityComparerの具体的な実装のGetHashCodeはどのように機能しますか?
私が尋ねる理由は、linqを使用して2つのコレクションを結合し、左側のコレクションのみにアイテムがある場合、GetHashCodeが2回呼び出されるためです。さらに、両方のコレクションに1つの行がある場合、4回呼び出されます。
これは大まかなタイピングですが、要点はわかります。GetHashCodeは2回呼び出されますが、listOneの1つのアイテムに対して2回呼び出されると思いますか?
例えば
ありがとう
xamarin.ios - GetHashCode()は、NSObjectから派生したオブジェクトのMonoTouchで正しく機能しますか?
NSObject駆動オブジェクトからGetHashCode()を呼び出すときに、MonoTouchが基になる「ハッシュ」メッセージを正しく呼び出すかどうかを調べようとしています。任意のオブジェクト(私の例ではNSAttributedString)に対するGetHashCode()の実装(MDのアセンブリブラウザー内)を簡単にチェックすると、object.InternalGetHashCode()が呼び出されるため、「hash」は呼び出されないようです。「ハッシュ」も公開されていないようです。そのため、別の方法があるのではないかと思います。誰かが前にこの道を進んでいましたか?
c# - 単体テスト - コードがほとんど単なる計算である場合 (GetHashCode など) はどうしますか?
GetHashCode の単体テストに進むと、元のコンポーネントを計算するか、関数を繰り返すか、事前に定義された値を使用するかで迷っています。
それとも何か他の方法がありますか?