問題タブ [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# - C# がコレクションに GetHashCode を実装しないのはなぜですか?
Java から C# に何かを移植しています。Java では、hashcode
の はArrayList
その中の項目に依存します。C#では、常に同じハッシュコードを取得しList
ます...
どうしてこれなの?
一部のオブジェクトでは、リスト プロパティ内のオブジェクトによってオブジェクトが等しくないため、ハッシュコードを異なるものにする必要があります。ハッシュコードはオブジェクトの状態に対して常に一意であり、オブジェクトが等しい場合にのみ別のハッシュコードと等しくなると思います。私が間違っている?
c# - C#オブジェクト参照からハッシュコードを計算する方法
皆さん、ここにあなたにとって厄介な問題があります!
TickZoomシステムの一部は、すべてのタイプのオブジェクトのインスタンスをDictionary<>タイプに収集する必要があります。
それらの同等性とハッシュコードは、値の同等性ではなく参照の同等性を意味するオブジェクトのインスタンスに基づいていることが不可欠です。課題は、システム内の一部のオブジェクトが値の同等性として使用するためにEquals()とGetHashCode()をオーバーライドし、それらの内部値が時間の経過とともに変化することです。つまり、EqualsとGetHashCodeは役に立たないということです。これを煩わしくではなく一般的に解決するにはどうすればよいですか?
これまで、ハッシュ用にObjectHandleという各オブジェクトを辞書にラップする構造体を作成しました。以下に示すように、Equals()を実装しましたが、ハッシュコードの計算方法の問題が残っています。
見る?オブジェクト内のオーバーライドされたEquals()実装に関係なく、参照の同等性を比較するメソッドobject.ReferenceEquals()があります。
では、オーバーライドされたGetHashCode()メソッドを気にせずに、参照のみを考慮して、一致するGetHashCode()を計算するにはどうすればよいでしょうか。
ああ、これがあなたに面白いパズルを与えることを願っています。私たちはここで立ち往生しています。
よろしくお願いいたします。ウェイン
c# - Entity Framework 4 は、独自のクラス プロパティの Equals と GetHashCode を上書きします
.NET 4 および Entity Framework 4 で Visual Studio 2010 を使用しています。EF4 ジェネレーターではなく、POCO クラスを使用しています。Equals()
メソッドとメソッドをオーバーライドする必要がありますが、GetHashCode()
実際には機能しません。誰もがすることだと思いましたが、オンラインで問題について何も見つかりません。
独自のクラスとEquals
メソッドを作成するときはEquals()
、プロパティを使用します。これらは、EF によって読み込まれて埋められる必要があります。このような:
そのコードは機能しません。問題は にEquals
あり、取得しようとする場所または取得GetHashCode
しようとする場所にあります。Linq2Entites でデータを取得しようとすると、毎回 NullRefernceException が発生します。HashCode
Equal
ItemType
これを修正する汚い方法は、NullReferenceException をキャプチャしてfalse
(Equals によって) 返され、 base.GetHashCode()
(によってGethashCode
) 返されることですが、この問題を修正するためのより良い方法があることを願っています。
DB および POCO ドメイン用の SQL スクリプト、EDMX ファイル、およびコンソール テストのメイン メソッドを使用して、小さなテスト プロジェクトを作成しました。ここからダウンロードできます: ダウンロード
.net - System.Stringオブジェクトがハッシュコードをキャッシュしないのはなぜですか?
Reflectorstring.GetHashCode
を使用するためのソースコードを一目見ると、次のことがわかります(mscorlib.dllバージョン4.0の場合)。
の実装がGetHashCode
指定されておらず、実装に依存していることに気付いたので、「GetHashCode
XまたはYの形式で実装されていますか?」という質問があります。本当に答えられません。私はいくつかのことに興味があります:
- ReflectorがDLLを正しく分解し、これが
GetHashCode
(私の環境での)実装であるstring
場合、この特定の実装に基づくオブジェクトがハッシュコードをキャッシュしないことを示すために、このコードを解釈するのは正しいですか? - 答えがイエスだとすると、なぜそうなるのでしょうか。メモリコストは最小限であるように思われますが(32ビット整数が1つ増え、文字列自体のサイズと比較して池が低下します)、特に文字列が使用されている場合は、大幅な節約になります。のようなハッシュテーブルベースのコレクションのキーとして
Dictionary<string, [...]>
。また、string
クラスは不変であるため、によって返される値がGetHashCode
変更されることはありません。
何が欠けている可能性がありますか?
更新:Andras Zoltanの閉会の辞に応えて:
ティムの答え(そこに+1)にもポイントがあります。彼が正しい場合、そして私が彼が正しいと思う場合、文字列が構築後に実際に不変であるという保証はありません。したがって、結果をキャッシュすることは間違っています。
おっと、おっ!これは興味深い点です(そしてそうです、それは非常に真実です)が、これがの実装で考慮されたことは本当に疑わしいGetHashCode
です。「したがって、結果をキャッシュするのは間違っている」というステートメントは、文字列に関するフレームワークの態度が「まあ、それらは不変であるはずですが、実際に開発者が卑劣になりたい場合は可変であるため、処理します」ということを意味しますそれら自体。」これは、フレームワークが文字列を表示する方法ではありません。それは非常に多くの方法でそれらの不変性に完全に依存しています(文字列リテラルのインターン、すべての長さゼロの文字列の割り当てstring.Empty
など)、基本的に、文字列を変更すると、動作が完全に定義されておらず、予測できないコードを記述していることになります。
私のポイントは、この実装の作成者が「この文字列インスタンスが、公開されているクラスが不変であるにもかかわらず、呼び出し間で変更された場合はどうなるか」ということです。カジュアルな屋外バーベキューを計画している人が、「誰かが原子爆弾をパーティーに持ってきたらどうなるだろうか」と考えてみてはいかがでしょうか。ほら、誰かが原子爆弾を持ってきたら、パーティーは終わった。
.net - 辞書のキーとして可変オブジェクトを使用することはまったく問題ありませんか?
特別なクラスがあり、それぞれを1つだけWrappedDataTable
に関連付けたいとします。さらに、特定のに対して存在するのは1つだけである必要があります。WrappedDataTable
DataTable
WrappedDataTable
DataTable
同僚は、次のように、自分をキャッシュWrappedDataTable
してファクトリメソッドを使用してアクセスできると提案しました。
辞書のキーは不変の型でなければならないという考えに慣れてきたので、これは最初は非常に疑わしいと思いました。しかし、おそらくこれは必ずしもそうではありませんか?簡単なテストでDataTable
、コンテンツに多数の変更を加えても、コンシステントハッシュコードが維持されているように見えることがわかりました。したがって、aは一貫Dictionary<DataTable, TValue>
して正しい値を返すことができるように見えます。ContainsKey
私が疑問に思っているのは、のベースバージョンがobject.GetHashCode
デフォルトで個々のオブジェクトごとに不変の値を返すのか、それとも私が見ているDataTable
のは単なる幻想なのかということです。
前者が真実であり、object.GetHashCode
問題なく機能する場合、「キーとして不変の型のみを使用する」というアドバイスは、実際には次のようなシナリオにのみ適用されるようです。
- オブジェクトの同等性は、参照の同等性ではなく、ほぼ値の同等性である必要があります。
GetHashCode
タイプのメンバーに基づく独自の実装を持つカスタムタイプがあります。
私のためにこれに光を当てる気になっている賢人はいますか?
更新:私の質問に答えてくれたJonSkeetに感謝します。他のニュースでは、私はいくつかの掘り下げを行い、結局のところアイデンティティ比較を提供するものを思いついたと思いIEqualityComparer<T>
ます!それをチェックしてください(申し訳ありませんが、VB.NETは嫌いです、私はVB.NETプロジェクトを立ち上げたばかりなので、それを書いたのです-翻訳は簡単です):
このサンプルプログラムを見てください。
出力:
c# - Generating a good hash code (GetHashCode) for a BitArray
I need to generate a fast hash code in GetHashCode for a BitArray. I have a Dictionary where the keys are BitArrays, and all the BitArrays are of the same length.
Does anyone know of a fast way to generate a good hash from a variable number of bits, as in this scenario?
UPDATE:
The approach I originally took was to access the internal array of ints directly through reflection (speed is more important than encapsulation in this case), then XOR those values. The XOR approach seems to work well i.e. my 'Equals' method isn't called excessively when searching in the Dictionary:
#xA;However, the approach suggested by Mark Byers and seen elsewhere on StackOverflow was slightly better (16570 Equals calls vs 16608 for the XOR for my test data). Note that this approach fixes a bug in the previous one where bits beyond the end of the bit array could affect the hash value. This could happen if the bit array was reduced in length.
#xA;The GetInternalValues extension method is implemented like this:
#xA;Any suggestions for improvement are welcome!
.net - コンパイラが生成した GetHashCode()
私は .net で実行される言語用のコンパイラの作成に取り組んでおり、GetHashCode メソッドを自動的に生成することを望んでいますが、いくつか質問があります。
- これは可能ですか?コンパイラは、メソッドを実装する合理的な仕事をするために、関与する型について十分に知っていますか?
- 値型、参照型、またはその両方に対してこれを行う必要がありますか?
- null プロパティなどのサポートを含む、コンパイラが生成する合理的な GetHashCode アルゴリズムは何ですか?
- これは、私が見ることができる別の言語/コンパイラで行われましたか?
- これが不可能である、または本当に悪い考えである場合、その理由は何ですか?
ありがとう
c# - 小規模クラスに適したハッシュ? (GetHashCode をオーバーライド)
1 ~ 2 個の int、おそらく datetime または小さな文字列を含む ID クラス/構造体を使用しています。これらを辞書のキーとして使用します。
このような場合に GetHashCode をオーバーライドするにはどうすればよいでしょうか? 非常にシンプルですが、うまくいけばある程度パフォーマンスが向上します。
ありがとう
c# - Equals、GetHashCode、EqualityComparers、およびファジー等価
プロパティ A、B、C、D、StartDate、EndDate を持つオブジェクトの場合、A、B、C が同一で日付範囲が重複している場合に 2 つのオブジェクトが等しいものを実装したい場合、どうすればよいでしょうか?
私はそのようにEqualityComparerを作成しようとしました
しかし、フレームワークの多くの場所が Equals を無視して GetHashCode を使用しているようで、ドキュメントはそれについてまったく明確ではありません。GetHashCode を実装するときに、日付を無視せずに HashCode を同じにする方法がわかりません。
もう少し具体的にすると、これはプロジェクト管理とレートに関係しています。同じ役割の同じプロジェクトの同じ人物が、同じ期間に異なる料金を請求できないというビジネス ルールを実装したいと考えています。したがって、Project DeathMarch で DBA の役割を果たしている Bob は、自分の時間を記録するために、任意の時点で 1 つの有効な請求レートしか持つことができません。彼が同じ期間に別のレートで QA アナリストの役割で数時間を記録する必要がある場合は、問題ありません。これは大規模な既存システムであるため、ドメイン オブジェクト構造を変更することはできません。
c# - 文字列キーを持つ GetHashCode()
こんにちは、私は .NET でオブジェクトの GetHashCode() オーバーライドを実装するための最良の方法を調べてきましたが、私が遭遇したほとんどの回答には、数値型のメンバーから数値を何らかの方法で変更してメソッドを作成することが含まれています。問題は、英数字の文字列をキーとして使用するオブジェクトがあり、文字列をキーとしてオブジェクトの内部 ID を使用するだけで、次のような根本的な問題があるかどうか疑問に思っていることです。
英数字の文字列をキーとして使用するオブジェクトの一意のハッシュ コードを作成するより良い方法はありますか? (いいえ、英数字文字列の数値部分は一意ではありません。これらの文字列の一部には、実際には数字がまったく含まれていません。)