問題タブ [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 を介して 2 つの EntityCollections と交差する
この質問をあまり繰り返さないでください。しかし、私はすでに検索を行っており、結果は空でした。したがって、タイプ T の 2 つの EntityCollections があり、それぞれに共通の項目を見つけたいと考えています。キャッチ?1 つを除くすべてのフィールドが一致する必要があります。たとえば、タイプ T がタイプ CustomSet であり、CustomSet にフィールド F1、F2、F3 および FK フィールド OtherId が含まれている場合、F1、F2、および F3 は一致する必要があり (文字列、int、実際には何でもかまいません)、OtherId は決して一致しません。マッチ。私の現在の実装:
フィールド F1、F2、および F3 が一致する場合でも、OtherId 列が他のコレクションで一致することはないため、結果は得られません。そこで、次のような IEqualityComparer のカスタム実装を提案します。
今、私はこれをテストしているだけなので、渡される obj は CustomSet 型です。これを適切に機能させることができれば、他の型に必要な if ステートメントを追加します。Intersect 拡張機能は、Equals の代わりに GetHashCode を使用して項目を比較することを知っています。これが、EntityCollections の Intersect 拡張機能以外では、このクラスが呼び出されることはないため、equals の内容を本当に気にしない理由です。問題は、これは機能しないということです。私のテスト セットでは、「ソース」コレクションに 28 個のアイテムがあり、「宛先」コレクションに 28 個のアイテムがあり、すべてのフィールドが一致していることがわかります (もちろん、OtherId フィールドを除く)。GetHashCode コードは 56 回ループし、各セットの 28 アイテムすべてのハッシュ コードを一致させることができましたが、「交差」は 0 カウントでした。私が間違っていること、または欠けていることはありますか?ありがとう。}
c# - 修飾キーの状態で System.Windows.Input.Key 値を正常にハッシュする方法は?
System.Windows.Input.Key 値を修飾キー状態で正常にハッシュするハッシュ アルゴリズムを作成しようとしています。たとえば、次のようになります。
したがって、このようなキー値は、ctrl、shift、alt などの状態が異なる他の値から分離する必要があります。しかし、これらは単に true または false であるため、ハッシュ値を区別する方法がわかりません。
何か案は?すべての可能なキーの組み合わせを処理するのに十分なだけ一意である必要があります。
c# - ツリー内のアイテムの場所に基づいて、ツリーのようなデータ構造のハッシュコードを作成するにはどうすればよいですか?
各アイテムは次のようになります。
これらのアイテムの多くのインスタンスを相互に接続してツリーのような構造を形成することで、ツリーのような構造を作成したいと思います。しかし、後で各アイテムをディクショナリにハッシュしたいので、ツリー上のどこにあるかに基づいてハッシュ値を作成できれば、一意の十分なハッシュ値を取得できると思いました。
これを行う方法についてのアイデアはありますか?
c# - オブジェクトの識別子が null の場合、GetHashCode は何を返す必要がありますか?
ID プロパティが null になる可能性があることを考えると、次のうちどれが正しい/より良いものですか。
また
更新 1: 2 番目のオプションを更新しました。
更新 2: 以下は Equals の実装です。
そしてIDはstring
型です。
c# - データベースに安全に格納できる文字列の HashCode を .net (c#) で作成するにはどうすればよいですか?
Eric Lippert によるGetHashCode のガイドラインとルールから引用するには:
ルール: GetHashCode のコンシューマは、長期にわたって、またはアプリケーション ドメイン間で安定していることに依存できません。
Name、Address などの多数のフィールドを持つ Customer オブジェクトがあるとします。2 つの異なるプロセスでまったく同じデータを持つ 2 つのオブジェクトを作成した場合、それらは同じハッシュ コードを返す必要はありません。火曜日に 1 つのプロセスでそのようなオブジェクトを作成し、それをシャットダウンして、水曜日にプログラムを再度実行すると、ハッシュ コードが異なる可能性があります。
これは過去に人々を噛んだ。System.String.GetHashCode のドキュメントでは、CLR のバージョンが異なると 2 つの同一の文字列が異なるハッシュ コードを持つ可能性があり、実際にそうであることが具体的に記載されています。文字列ハッシュをデータベースに保存しないでください。それらが永遠に同じであることを期待してはいけません。
では、データベースに格納できる文字列の HashCode を作成する正しい方法は何ですか?
(私が書いたソフトウェアにこのバグを残したのは私が初めてではないことを教えてください!)
c# - x86 環境と x64 環境で同じ値を返す String.GetHashCode() のオーバーロードを作成する
サーバー側のコードが x86 環境で実行され、クライアント側が x64 で実行されるシナリオがあります。String.GetHashCode() を使用して HashTable 内のオブジェクトを識別するという問題が発生しています。「GetHashCode の動作はその実装に依存しており、共通言語ランタイムのバージョンによって異なる可能性があります。」-MSDN. アンセーフ コードを使用して、次のスタック オーバーフローの質問から x86 相当の GetHashCode() を作成しました。.
いくつか質問がありました:
- 安全でないコードをマネージ コードの世界に残すことは推奨されますか。
- 上記の質問の安全でないコードを安全なコードに変換する方法。
c# - C# GetHashCode() を DB に格納するのは信頼できない
重複の可能性:
データベースに安全に格納できる文字列の HashCode を .net (c#) で作成するにはどうすればよいですか?
データベースに何十万もの URL を保存することを計画しています。UrlInfo テーブルの各行は、URL 自体が論理的な主キーであり、変更できません。URL はかなり長くなる可能性があるため、新しい行を追加するときに一致する可能性のあるものをすばやく見つける方法として、URL をハッシュすることにしました。ハッシュは私の真のキーではなく、可能な一致をすばやく見つける方法です。さらに、ドメインごとに RegEx パターンを使用して、URL の本質を抽出し、他の URL と比較できるようにしています。正規表現の結果もハッシュとして保存していますが、重複の可能性があるかどうかは心配していません。
物事をハッシュするために使用してきた C# の string.GetHashCode() メソッドが、.Net の実装間で一意であることが保証されていないことを知るまで、すべてが順調に進んでいました。これは、ハッシュ関数を ASP.Net から SQLServer CLR コードに移動しようとしたときに気付きました。Web アプリは .Net 4.0 を使用し、SQLServer 2008 R2 は .Net 3.5 を使用していることを知りました。同じ文字列に対して個別のハッシュ結果が得られたため、string.GetHashCode() を使用しないようにする必要があります。これは、アプリを将来のバージョンの .Net にアップグレードするときにこの変更について心配する必要がないためです。
だから、質問:
データベースにハッシュを保存しているため、アーキテクチャの臭いはありますか? より良い方法はありますか?明らかに、Microsoft は私がハッシュ結果を保存することを望んでいません!
文字列をハッシュするための優れた C# 置換アルゴリズムを誰かが推奨できますか? Jon's hereを見ましたが、文字列に対して機能するように変更する方法が正確にはわかりません(ASCIIコードを使用して各文字をループしますか?)。
ハッシュアルゴリズムを使用するよりも優れた文字列圧縮アルゴリズムはありますか?
ありがとう
多くの人から素晴らしい反応。どうもありがとうございます!!!
c# - C# GetHashCode の質問
少なくとも 1 つのフィールドが一致するGetHashCode
場合にオブジェクトが等しいと見なされる場合、関数をオーバーライドする最良の方法は何でしょうか。
ジェネリックEquals
メソッドの場合、例は次のようになります。
GetHashCode
それでも、この場合の適切な実装を行うことについて混乱しています。
これはどのように行うべきですか?
ありがとうございました。
c# - 「dibs」を持つ型の Equals と GetHashCode をオーバーライドしますか?
この質問とジョンの答えは、これが存在することさえあることに気づいたので、興味を持って Visual Studio を起動しました。
MSDN ページの 1 つの例をたどってから、独自の小さな例を作成しました。それは次のとおりです。
だから私はいくつかの質問があります:
Equals メソッドがカスタムの等価性を適切に処理する場合、GetHashCode メソッドもオーバーライドする必要があるのはなぜですか?
以下のようなものを比較する場合、Equals と GetHashCode のどちらの比較子が使用されますか?
.
- オペレーターメソッドは正確に何をしますか? ある種のブードゥー教の黒魔術が行われているようです。
c# - Equals()/ GetHashCode()を正しく実装しましたか?
プログラムはこの実装で動作していました:
しかし、辞書でInstrumentを使用する必要があるため、equals/hashcodeを実装することにしました。
これで、プログラムは動作を停止しました。そのような場所または同様の場所で、「KeyNotFoundException」を受け取ります。
コードの一部がequalsを想定していて、ハッシュコードが実装されていない可能性はありますか?それとも私はそれらを間違って実装したのでしょうか?申し訳ありませんが、コードの最後の部分のようなC#の高度な機能に精通しておらず、equalsまたはhashCodeとどのように接続されているのかわかりません。