2

私は次のクラスを持っています:

public class Foo
{
    int year;       
    string name;    
    int category;   
}

以下にデータの例を示します。

2012    Test1   1000
2012    Test2   1000
2012    Test3   1000    
2012    Test4   1000
2012    Test4   10
...

GetHashCode をオーバーライドすると、すべての結果は非常に似ています。

return year ^ name ^ category;

int hash = 13;
    hash = hash * 33 + year.GetHashCode();
    hash = hash * 33 + name.GetHashCode();
    hash = hash * 33 + category.GetHashCode();
    return hash; 

この状況に適した (最大分布の) ハッシュ関数は何ですか?

編集: ハッシュ バケットに関する私の理解が間違っている可能性があります。類似のハッシュ値を同じバケットに移動しますか?

"Test1".GetHashCode() --> -1556460260
"Test2".GetHashCode() --> -1556460257
4

1 に答える 1

3

私がお勧めすることの 1 つは、Stringオブジェクトが nullかどうかを確認することです。

実装は問題ないようです。同様ですが、主な目的はハッシュコードを異なるバケットに着陸させることであるため、ハッシュコードは異なる必要があります。したがって、さらなる操作に役立ちます。

   public int hashCode() {    // Assuming year and category are String like name.
    int hash = 31;
    hash = hash * 331 + (this.year != null ? this.year.GethashCode() : 0);
    hash = hash * 331 + (this.name != null ? this.name.GethashCode() : 0);
    hash = hash * 331 + (this.category != null ? this.category.GethashCode() : 0);

    return hash;
}

hashCode のオーバーライド中に学んだいくつかの手順は次のとおりです。

  1. 5、7、17、または 31 などのプライム ハッシュを選択します (ハッシュとしての素数は、個別のオブジェクトの個別のハッシュコードになります)。
  2. ハッシュとは異なる乗数が良いので、別の素数を取ります。
  3. 各メンバーのハッシュコードを計算し、それらを最終ハッシュに追加します。対等に参加したすべてのメンバーに対してこれを繰り返します。
  4. ハッシュを返します。
于 2013-08-08T13:27:25.990 に答える