0

为一个类生成哈希码时,可以使用该类成员的哈希码吗?这是一个示例类:

class Sample
{
    private readonly string _strA, _strB;
    public Sample(string strA, string strB)
    {
        this._strA = strA;
        this._strB = strB;
    }
    public override int GetHashCode()
    {
        return (this._strA + "###" + this._strB).GetHashCode();
    }
}

我认为只要 _strA 和 _strB 都不包含字符串“###”,这将起作用。我不完全确定,因为我不知道如何在字符串上生成哈希码的细节。

我在创建两个数字的哈希码的帖子中看到了一个解决方案,我可以根据自己的目的进行定制,但我认为我的解决方案更简单(只要两个字符串都不包含“###”)。

4

2 回答 2

2

如果您有多个字段对对象的整体哈希码有贡献,那么一种简单且相当有效的方法是:

public override int GetHashCode()
{
    int hash = 17;

    hash = hash*23 + field1.GetHashCode();
    hash = hash*23 + field2.GetHashCode();
    hash = hash*23 + field3.GetHashCode();

    // And so on for all applicable fields.
    // field1, field2 and field3 are all class field members.

    return hash;
}
于 2012-07-31T15:30:15.410 回答
1

更好的方法是使用 Times 33 hash 之类的东西以数学方式组合哈希码。在您当前的代码中,每次GetHashCode调用时都会创建一个临时字符串,这可能会导致性能不佳。

public override int GetHashCode()
{
    // omit null-coalesce if we know them to be non-null
    return (33 * (this._strA ?? "").GetHashCode())
         + (this._strB ?? "").GetHashCode();
}

如果您的类是真正不可变的,那么预先计算哈希码可能值得 4 字节:

private readonly int _hash;

public Sample(string strA, string strB)
{
    this._strA = strA;
    this._strB = strB;
    this._hash = (33 * (this._strA ?? "").GetHashCode())
               + (this._strB ?? "").GetHashCode();
}

public override int GetHashCode()
{
    return this._hash;
}
于 2012-07-31T15:21:02.067 回答