【问题标题】:What is equivalent for Java Objects.hash and Objects.hashCode in C#C# 中 Java Objects.hash 和 Objects.hashCode 的等价物
【发布时间】:2021-11-20 03:40:23
【问题描述】:

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

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

【问题讨论】:

  • .Net 中的每个对象都实现了 GetHashCode。您还要求别的吗?
  • @Amy:GetHashCode 仅带有默认实现。如果我们想将对象用作映射键或将对象放入哈希集中,我们仍然需要覆盖它。看到这个:docs.microsoft.com/en-us/dotnet/api/…
  • 什么“正确”的实现? .Net 哈希码与 Java 哈希码不同。它们一直用于哈希集,没有问题。
  • 为什么不一样?您对对象哈希码以及我们为什么需要它的理解是错误的......
  • 你说得对,我不明白为什么默认实现适用于其他所有人,但不适用于你。

标签: c# gethashcode


【解决方案1】:

与此等效的 .NET 是新的 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 上运行,则必须自己实现哈希码计算。这样做的好方法是documented here。

【讨论】:

  • 感谢 System.HashCode.Combine,这正是我想要的。
猜你喜欢
  • 2012-07-20
  • 2018-05-17
  • 2014-08-29
  • 2011-07-21
  • 1970-01-01
  • 2010-11-19
  • 2010-10-24
  • 1970-01-01
  • 2014-11-22
相关资源
最近更新 更多