有什么理由不使用 .NET 中的 GetHashCode 生成条件哈希代码

本文关键字:GetHashCode 条件 代码 哈希 中的 NET 理由 什么 | 更新日期: 2023-09-27 18:35:15

在我用作文档或文档+页面标识符的类中,我使用以下GetHashCode实现。它"感觉"正确,但由于我以前从未真正在这种方法中看到特定于领域的条件反射,我想知道是否有理由不这样做。当然,ToString 方法也有相同的条件。

public override int GetHashCode ()
{
    int hash = 0;
    unchecked
    {
        hash = 17;
        hash = hash * 23 + this.ProductManufacturer.Value.GetHashCode();
        hash = hash * 23 + this.ProductName.Value.GetHashCode();
        hash = hash * 23 + this.ProductVersion.Value.GetHashCode();
        hash = hash * 23 + this.Guid.Value.GetHashCode();
        if (this.Type != IdentifierType.Document)
        {
            hash = hash * 23 + this.PageNumber.Value.GetHashCode();
            hash = hash * 23 + this.PageCount.Value.GetHashCode();
        }
    }
    return (hash);
}

根据答案和 Eric 的链接更新了代码

public bool Equals (Identifier other)
{
    return (this.Equals(other, this.Type));
}
public override bool Equals (object obj)
{
    return ((obj is HouseOIdentifier) && (this.Equals(obj as Identifier)));
}
public bool Equals (Identifier other, IdentifierType type)
{
    bool result = false;
    if (object.ReferenceEquals(this, other))
    {
        result = true;
    }
    else if (!object.ReferenceEquals(other, null))
    {
        result
            = (this.Type == other.Type)
            && (this.ProductManufacturer.Key == other.ProductManufacturer.Key)
            && (this.ProductManufacturer.Value == other.ProductManufacturer.Value)
            && (this.ProductName.Key == other.ProductName.Key)
            && (this.ProductName.Value == other.ProductName.Value)
            && (this.ProductVersion.Key == other.ProductVersion.Key)
            && (this.ProductVersion.Value == other.ProductVersion.Value)
            && (this.Guid.Key == other.Guid.Key)
            && (this.Guid.Value == other.Guid.Value)
            ;
        if (type == IdentifierType.Page)
        {
            result
                &= (this.PageNumber.Key == other.PageNumber.Key)
                && (this.PageNumber.Value == other.PageNumber.Value)
                && (this.PageCount.Key == other.PageCount.Key)
                && (this.PageCount.Value == other.PageCount.Value)
                ;
        }
    }
    return (result);
}
public override int GetHashCode ()
{
    int hash = 0;
    unchecked // Overflow is fine, just wrap.
    {
        hash = 17;
        hash = hash * 23 + this.Type.GetHashCode();
        hash = hash * 23 + this.ProductManufacturer.Key.GetHashCode();
        hash = hash * 23 + this.ProductManufacturer.Value.GetHashCode();
        hash = hash * 23 + this.ProductName.Key.GetHashCode();
        hash = hash * 23 + this.ProductName.Value.GetHashCode();
        hash = hash * 23 + this.ProductVersion.Key.GetHashCode();
        hash = hash * 23 + this.ProductVersion.Value.GetHashCode();
        hash = hash * 23 + this.Guid.Key.GetHashCode();
        hash = hash * 23 + this.Guid.Value.GetHashCode();
        if (this.Type == HouseOfSynergy.FastForm.Core.Identifier.EnumType.Page)
        {
            hash = hash * 23 + this.PageNumber.Key.GetHashCode();
            hash = hash * 23 + this.PageNumber.Value.GetHashCode();
            hash = hash * 23 + this.PageCount.Key.GetHashCode();
            hash = hash * 23 + this.PageCount.Value.GetHashCode();
        }
    }
    return (hash);
}
public override string ToString ()
{
    return ("whatever");
}

有什么理由不使用 .NET 中的 GetHashCode 生成条件哈希代码

只要相等的对象具有相同的哈希代码,您的实现就可以了。这是唯一的要求。如何计算哈希代码,即是否使用 if 语句,并不重要。

(此外,如果哈希代码在

对象的生命周期内从未更改过,那就太好了,因为它几乎破坏了任何使用哈希代码的数据结构。理想情况下,对象应该是不可变的。