1

オブジェクト内のすべてのプロパティの組み合わせによって一意性が決定されるオブジェクトをキャッシュしようとしています。私が持っているオブジェクトは次のようなものです:

    public double A { get; set; }
    public double B { get; set; }
    public short C { get; set; }
    public bool D { get; set; }
    public double E { get; set; }
    public double F { get; set; }
    public double G { get; set; }
    public double H { get; set; }
    public double J { get; set; }
    public double K { get; set; }
    public double[] L { get; set; }
    public double[] M { get; set; }

上書きGetHashCodeして次のようにすることもできますreturn A ^ B ^ C etc... が、多くの衝突が発生するのではないかと心配しています。

このようなオブジェクトをキャッシュする最良の方法は何でしょうか?

4

2 に答える 2

4

これを使用できますGetHashCode

public override int GetHashCode()
{
    int hash = 23;
    unchecked
    {
        hash *= 17 + A.GetHashCode();
        hash *= 17 + B.GetHashCode();
        hash *= 17 + C.GetHashCode();
        // the same applies with the rest of your properties ...
        // collections must be treated differently:
        if(L != null)
        {
            hash *= 17 + L.Length;
            foreach(var d in L)
                hash *= 17 + d.GetHashCode();
        }
        if (M != null)
        {
            hash *= 17 + M.Length;
            foreach (var d in M)
                hash *= 17 + d.GetHashCode();
        }         
    }
    return hash;
}

これにより、異なるプロパティが同じ値を持つ場合に異なるハッシュコードが生成されます。素数乗数を省略しても、A==Aまたはの場合は違いはありませんA==B。素数は、誤った衝突の可能性を減らすために使用されます。

また、配列とその値と順序も考慮されます。

これは、このトピックに関する「必読」です: E. Lippert、GetHashCode のガイドラインとルール

于 2013-03-14T22:23:21.140 に答える
0

単純な (最適ではないかもしれませんが) 解決策は次のとおりです。

  1. クラスの文字列表現を生成します。エスカラー プロパティしかない場合は、次のようなことができますstring.Format("{0}-{1}-{2}", A, B, C)。配列があるので、 a を使用してStringBuilder、ループ内で文字列を構成することをお勧めします。

  2. 生成された文字列で呼び出しGetHashCodeます。

于 2013-03-15T09:17:02.107 に答える