2

を抽象Abstractクラスとし、A1,A2,...,Anから継承する具象クラスにしAbstactます。のそれぞれにAiは、コンパイル時に既知のプリミティブ型のリストAbstractと定義済みのセットがあります。それらのハッシュ関数があり、各具体的な要素の構造に「ループ」がないと仮定しましょう。

2 つの要素 e1 と e2 は、事前定義されたプリミティブに対して同じ値を持ち、e1 のそれぞれに対して、e1 と e2 が同一になるように e2Abstractに an が存在する場合、Abstract同一です。(つまり、順序は重要ではありません)。

この種の問題に適したハッシュヒューリスティックを探しています。これは完全なハッシュ関数であってはなりません (私の知る限りではそうではありません) が、実行時の計算が簡単で優れているはずです。

誰かがそのような機能を実装する方法のガイドラインを教えてくれたり、この問題に対処する記事を教えてくれたりしてくれたらうれしいです。

hash()PS私はJavaで書いていますが、ビルトインではこの問題には十分ではないと 思います(間違っている場合は修正してください) 。
EDIT :
リストとプリミティブは構築後に修正されますが、コンパイル時には不明です。

4

2 に答える 2

2

これらのリストが構築された後に変更される可能性がある場合、それらに基づいてハッシュ関数を作成することはお勧めできません。オブジェクトを に貼り付けて、HashMapその一部を変更したと想像してください。HashMap異なるため、で見つけることができなくなりますhashCode

の結果はhashCode、不変の値にのみ基づく必要があります。オブジェクトに不変の値がない場合は、単純に basic を使用するObject.hashCode()ことをお勧めしますが、同等性テストで負けてしまいます。

ただし、これらのオブジェクトが不変である場合は、要素に対して何らかの並べ替え順序を選択することをお勧めします。次に、ハッシュする前に値を並べ替えているため、リストの順序が異なっていても同じであることを知って、リスト全体のハッシュ コードを計算できます。

于 2011-03-28T14:00:10.933 に答える
1

Google Guava のユーティリティを使用してください... Objects.hashCode()は素晴らしいです。また、ソースが利用可能であり、彼らはあなたが述べた問題を解決しているので、彼らの解決策を見ることができます.

于 2011-03-28T14:16:39.877 に答える