![](/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.