問題タブ [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# - プライベートメンバーのハッシュコードを組み合わせて新しいハッシュコードを生成することは可能ですか?
一意のハッシュを生成したい(GetHashCode()をオーバーライドした)オブジェクトがありますが、オーバーフローや予測できない何かを避けたいです。
コードは、文字列の小さなコレクションのハッシュコードを組み合わせた結果である必要があります。
ハッシュコードはキャッシュキーの生成の一部になるため、理想的には一意である必要がありますが、ハッシュされる可能性のある値の数が少ないため、ここでは確率が有利だと思います。
このようなもので十分であり、これを行うためのより良い方法はありますか?
編集:これまでの回答をありがとう。@Jon Skeet:いいえ、順序は重要ではありません
これはほとんど別の質問だと思いますが、結果を使用してキャッシュキー(文字列)を生成しているので、MD5のような暗号化ハッシュ関数を使用するか、このintの文字列表現を使用するのが理にかなっていますか?
c# - Object.GetHashCode
私の質問はObject.GetHashCode() のデフォルトの実装と重複している可能性がありますが、その回答に対する受け入れられた回答が理解できなかったため、再度質問しています。
まず、前の質問に対する受け入れられた回答について 3 つの質問があります。この回答は、次のようなドキュメントを引用しています。
「ただし、このインデックスはガベージ コレクション中にオブジェクトが回収された後に再利用できるため、2 つの異なるオブジェクトに対して同じハッシュ コードを取得することができます。」
これは本当ですか?オブジェクトがガベージ コレクションされる (つまり、存在しなくなる) まで、オブジェクトのコードは再利用されないため、2 つのオブジェクトが同じハッシュ コードを持たないように思えます。
「また、同じ値を表す 2 つのオブジェクトは、それらがまったく同じオブジェクトである場合にのみ、同じハッシュ コードを持ちます。」
これは問題ですか?たとえば、あるデータを DOM ツリーの各ノード インスタンスに関連付けたいとします。これを行うには、データのディクショナリでキーとして使用できるように、「ノード」に ID またはハッシュ コードが必要です。それが「まったく同じオブジェクト」であるかどうか、つまり「値の等価性」ではなく「参照の等価性」であるかどうかを識別するハッシュコードではありませんか?
「この実装は、ハッシュには特に有用ではありません。したがって、派生クラスは GetHashCode をオーバーライドする必要があります」
これは本当ですか?ハッシュに適していない場合、何か良いことがあるとすれば、それはなぜオブジェクトのメソッドとして定義されているのでしょうか?
私の最後の(そしておそらく私にとって最も重要な)質問は、「参照の等価性」セマンティクスを持つ任意の型の GetHashCode() 実装を発明/オーバーライドする必要がある場合、合理的で適切な実装は次のとおりです。
編集
参考までに、次のコードを使用してテストしました。
私のマシンでは、結果/出力は次のとおりです。
私の実装には、デフォルトの実装の半分の時間がかかります (ただし、私の型は m_allocated データ メンバーのサイズだけ大きくなっています)。
私の実装とデフォルトの実装はどちらも線形にスケーリングします。
比較すると、健全性チェックとして、愚かな実装は最初は悪く、スケーリングも悪くなります。
.net - スペースが 32 ビットより大きい場合、GetHashCode 互換の Equals メソッドを実装する方法は?
.NET では、Equals(object) と GetHashCode() に互換性がある必要があります。ただし、次のことができない場合があります。
データ密度が 32 ビットを超え、GetHashCode が Int32 を返すため、次の 3 つの解決策があります (GetHashCode が正しく実装されていると仮定します)。
/li>正しくないとして破棄されるコードの重複を避けるGetHashCode() とは別に Equals を実装する
/li>より高い精度の GetHashCode64 を実装すると、オーバーライドされた GetHashCode (32 ビット) は (int)GetHashCode64() を返し、Equals は this.GetHashCode64() == other.GetHashCode64() を返します。
どれを実装しますか?
最初の解決策は不正確ですが、よりクリーンです。2 番目のオプションはきれいに見えますが、クラスのプロパティが増えると非常に複雑になります。3 番目のオプションは妥協です。
c# - C#でGetHashCodeメソッドを作成する
C#のクラス用に独自のGetHashCodeメソッドを作成するための最良の方法は何ですか?次のような単純なクラス(Equalsメソッドをオーバーライドする)があるとします。
GetHashCodeメソッドにデフォルトのコードを使用する必要がありますか?
クラスの内容に基づいてメソッドを作成する必要がありますか?
それとも私は何か他のことをすべきですか?
java - 組み込み型の配列の java.util.Arrays.hashCode() 関数に相当する.NET?
int[]、short[]、float[] などの組み込み型の配列のjava.util.Arrays.hashCode()に相当する .NET ユーティリティ クラスはありますか?
もちろん、独自のユーティリティ クラスを作成することもできましたが、.NET フレームワークで既に利用可能なものを見つけようとしていました。
delphi - Delphi での GetHashCode の double から Integer への変換
Delphi 2009 では、GetHashCode 関数が TObject に追加されました。GetHashCode は、TDictionary でのハッシュに使用される整数を返します。
オブジェクトを TDictionary で適切に動作させるには、GetHashCode を適切にオーバーライドして、一般に、異なるオブジェクトが異なる整数ハッシュ コードを返すようにする必要があります。
しかし、double フィールドを含むオブジェクトに対してはどうすればよいでしょうか? これらの double 値を GetHashCode の整数に変換するにはどうすればよいでしょうか?
たとえば、Java で通常行われている方法は、Double.doubleToLongBits や Float.floatToIntBits などのメソッドを使用することです。後者には、次のように説明するドキュメントがあります。これには、浮動小数点値のさまざまなビットに対してさまざまなマスクを使用したビット演算が含まれます。
Delphiでこれを行う関数はありますか?
subsonic3 - int が null 許容の場合、ActiveRecord と GetHashCode は失敗します
GetHashCode で int が null 可能である場合に問題が発生します
ActiveRecord.tt の GetHashCode の時点で、null 許容チェックが必要です。このようなもの。
(更新) この値は、ビューでは null になる可能性があります。inet で見つけたこのコードを使用して、ビューを含めました。
その後、このエラーが表示されます。
c# - 完全なIEquatable実装リファレンスはありますか?
ここでのSOに関する私の質問の多くは、IEquatableの実装に関するものです。ナイーブな実装には多くの隠れたバグがあり、それについて私が見つけた記事はかなり不完全であるため、正しく実装することは非常に難しいことがわかりました。私は、以下を含まなければならない決定的な参照を見つけたり、書きたいと思っています。
- IEquatableを正しく実装する方法
- Equalsを正しくオーバーライドする方法
- GetHashCodeを正しくオーバーライドする方法
- ToStringメソッドを正しく実装する方法
- 演算子を正しく実装する方法==
- 演算子を実装する方法!=正しく
そのような完全な参照はすでに存在しますか?
PS:MSDNリファレンスでさえ私には欠陥があるようです
c# - GetHashCode を使用してオブジェクト ID を追跡できますか?
の用途はGetHashCode()
何ですか? を使用してオブジェクトのアイデンティティを追跡できますGetHashCode()
か? もしそうなら、例を挙げていただけますか?