クラスに対してhashCode()を実装する必要があると言われていますが、私のような人には、これをどうやって行うのか、あるいは「間違っている」場合はどうなるのかについての考えはありません。たとえば、ツリー内のノードをインデックスするためのハッシュ関数が必要です(Finding the most frequent subtrees in a collection of (parse) trees)。この場合、順序付き子ノードに基づいてハッシュコードを再帰的に生成する必要があります。ハッシュコードの回答のrecent discussionで平均的なプログラマーにとって「十分に良い」ハッシュ関数はありますか?
hashCode = function(child1.hashCode, child2.hashCode, ...)
(長期プライムおよび31に基づいて)文字列のハッシュを含めてもbitshifting。文字列のハッシュは:
// adapted from String.hashCode()
public static long hash(String string) {
long h = 1125899906842597L; // prime
int len = string.length();
for (int i = 0; i < len; i++) {
h = 31*h + string.charAt(i);
}
return h;
}
私はセキュリティに興味がなく、衝突を気にしません。害よりも優れた(そしてそれを全く呼び出すよりも良い)順序づけられたオブジェクトのハッシュコードを組み合わせるための「普遍的な機能」はありますか?
また、一般的なケースを検索できるサイトはありますか?文字列、リストなど)
普遍的なアプローチが期待されていたので、私は言語を指定しませんでした。しかし、言語に深刻な問題がある場合は、その言語とそれが普遍的でない理由を明記してください。
UPDATE IDEのhashCodeジェネレータを使用することをお勧めします。それは優れたデフォルト設定です。ここではNetbeansのです:
public int hashCode() {
int hash = 5;
// objects
hash = 97 * hash + (this.rootElement != null ? this.rootElement.hashCode() : 0);
hash = 97 * hash + (this.tableElement != null ? this.tableElement.hashCode() : 0);
// a string
hash = 97 * hash + (this.tag != null ? this.tag.hashCode() : 0);
return hash;
}
これは私が望んでいたように見えます。 Commonsから引用するには: "このクラスを使うと、どんなクラスに対しても良いhashCodeメソッドを構築することができます。これは、Joshua Bloch著「Effective Java」の規則に従っています。プロセスを簡略化します。 私はこれが私をより良い人間にしてくれるとは思っていませんが(私は著者の倫理的権利を気にしますが)、私はより良いプログラマーになれるよう願っています... –
ブロッホのアプローチは、 –
残念ながら、それらのリンクは現在死んでいます。 : – Skrylar