![](/img/trans.png)
[英]Hash code for comparing objects with the same structure between Java and C#
[英]What is equivalent for Java Objects.hash and Objects.hashCode in C#
从 Java 迁移到 C# 开发人员。 在 Java 中,我使用了很多Objects.hash(array)和Objects.hashCode(object)在 hashCode 函数中构建对象的哈希码。 我在 C# 中找不到这些函数的任何等效项。 有任何想法吗?
事实上,我可以调用GetHashCode
并将它们组合起来,如Concise 方式所示组合字段哈希码? ,但这需要对引用类型进行大量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 的等效项是新的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 上运行,则必须自己实现哈希码计算。 这里记录了这样做的好方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.