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;
}

当不同的属性具有相同的值时,这会生成不同的哈希码。如果我省略了素数乘数,那么 ifA==AA==B. 素数用于减少错误碰撞的可能性。

它还考虑了数组及其值+顺序。

这是该主题的“必读”:E. Lippert,GetHashCode 的指南和规则

于 2013-03-14T22:23:21.140 回答
0

一个简单(虽然可能不是最佳)的解决方案可能是:

  1. 生成类的字符串表示。如果您只有 escalar 属性,您可以执行以下操作string.Format("{0}-{1}-{2}", A, B, C);因为你有数组,你最好使用 aStringBuilder并在循环中组合字符串。

  2. 调用GetHashCode生成的字符串。

于 2013-03-15T09:17:02.107 回答