首页 > 解决方案 > C# 中 Java Objects.hash 和 Objects.hashCode 的等价物

问题描述

从 Java 转向 C# 开发人员。在 Java 中,我使用了很多Objects.hash(array)Objects.hashCode(object)在 hashCode 函数中构建对象的哈希码。我在 C# 中找不到这些函数的等效项。有任何想法吗?

事实上,我可以调用GetHashCode并组合它们,如Concise way to combine field hashcodes 所示?,但这需要null对引用类型进行大量检查,这使得代码比可比较的 Java 代码长得多。

在 Java 中:

public class MyObject {

    private Integer type;
    private String[] attrs;
    
    @Override
    public int hashCode() {
        int hash = 1, p = 31;
        hash = p * hash + Objects.hashCode(type); // Handle Null case
        hash = p * hash + Objects.hash(attrs); // Handle Null case
        return hash;
    }
}

在 C# 中:

public class MyObject {

    private int? type;
    private string[] attrs;
    
    public override int GetHashCode()
        int hash = 1, p = 31;
        hash = p * hash + hash_of(type);    // Any utilities?
        hash = p * hash + hash_of_array(attrs); // Any utilities?
        return hash;
    }
}

注意:我不是在寻找兼容的结果(因为我知道哈希码对于类似的对象会有所不同,甚至在同一框架的版本/平台之间也可能不同),而是寻找代码大小和简洁的方式。

标签: c#gethashcode

解决方案


与此等效的 .NET 是 new System.HashCode,特别是HashCode.Combine<>可用于从多个值创建哈希码的方法:

public class MyObject
{
    private int? type;
    private string[] attrs;

    public override int GetHashCode()
        => HashCode.Combine(type, attrs);

    // remember to also override Equals
}

请注意,此类型仅在 .NET Core 中可用。如果您在 .NET Framework 上运行,则必须自己实现哈希码计算。此处记录了执行此操作的好方法。


推荐阅读