C#中的對象有四種方法 - {Equals
,GetType
,ToString
, GetHashCode
}。
有人可以用散列碼做什麼有用的事情?如何處理.NET對象散列碼?
回答
有人可以用哈希碼做什麼有用的事情?
快速找到潛在等於對象。
特別是,此方法通常使用的類型如Dictionary<TKey, TValue>
(用於密鑰)和HashSet<T>
。
您應該而不是然而,假設具有相同散列碼的對象相等。有關更多信息,請參閱Eric Lippert's blog post;有關散列碼使用的更一般性討論,請參閱Wikipedia hash table頁面。
哈希碼是一個數值,用於在進行相等性測試期間標識對象 。它也可以作爲集合中對象 的索引。
GetHashCode方法適用於散列算法和散列表等數據結構。
GetHashCode方法的默認實現不是 保證了不同對象的唯一返回值。此外,.NET Framework不保證 GetHashCode方法的默認實現,並且它返回的值將在 不同版本的.NET Framework之間相同。因此,不得將此方法的默認實現用作散列目的的唯一對象 標識符。
GetHashCode方法可以被派生類型覆蓋。值 類型必須重寫此方法以提供適用於該類型的散列函數 並在散列表中提供有用的分佈。爲了唯一性,哈希碼必須基於實例字段或屬性的值 而不是靜態字段或 屬性。
用作Hashtable對象中的鍵的對象還必須覆蓋 GetHashCode方法,因爲這些對象必須生成其自己的散列 代碼。如果用作鍵的對象沒有提供有用的GetHashCode實現,則可以在構建Hashtable對象時指定哈希代碼提供程序 。在.NET Framework 版本2.0之前,散列碼提供程序基於 System.Collections.IHashCodeProvider接口。從版本 2.0開始,哈希碼提供程序基於 System.Collections.IEqualityComparer接口。
的基本想法是,如果兩個物體有不同的hash code,它們是不同的。如果它們具有相同的哈希碼,則它們可以不同或相等。
要檢查某個對象是否存在於一個集合中,您可以首先檢查哈希碼,因爲您正在比較整數,所以它會很快檢查,然後僅對具有相同哈希碼的對象執行更準確的測試。例如,
這被用在集合類中。
的GetHashCode
GetHashCode
只存在這兩種類型
的利益 - >哈希表
- >GenericDictionary
的GetHashCode爲您提供了良好的hashtable
表現多樣鍵。
Equals爲當類型是在編譯時未知一個null-safe
相等比較。 其簽名是
public static bool Equals(object A,object B)
。
所以你不能使用運營商如==
或!=
如果類型是在編譯time.You未知已Equals
它有用編寫泛型類型
例如,當使用方法:
class Test<T>
{
T value;
public void SetV(T newValue)
{
if(object.Equals(newValue,value))
//We have to use Object.Equals cant use == or !=since they cannot bind to unknown type at compile time
}
}
ToString
它返回一個類型實例的默認texual representation
.Thi S分析是所有內建類型
的GetType
GetType
在runtime.It評估重寫幫助我們知道是什麼類型的name
,assemby
,base type
..和別人
- 1. hashmap如何處理負散列碼?
- 2. 如何使用SHA1對密碼文件進行散列處理
- 3. .Net對象對應於IronRuby散列
- 4. 在.NET中處理對象?
- 5. 散列衝突如何處理?
- 6. Ruby可以處理大型散列對象
- 7. 存儲持久V8對象處理的散列容器
- 8. 理解散列碼
- 9. 如何處理XMLDocument對象
- 10. 如何處理googlemap對象?
- 11. PHP如何處理對象
- 12. 如何處理對象
- 13. 記錄對象散列碼有用嗎?
- 14. 在.NET中處理單例對象
- 15. 散列JavaScript對象
- 16. 如何使用SAS散列對象?
- 17. 如何從散列表返回對象
- 18. 如何加密散列JSON對象?
- 19. 散列表碰撞處理
- 20. 在.net遠程處理對象中處理異常
- 21. 如何確保在.NET中正確處理對象?
- 22. 如何處理.net對象中的事務?
- 23. .NET Remoting:如何處理斷開的對象
- 24. .NET N層體系結構:我該如何處理Model對象?
- 25. 我應該如何處理.NET對象中的組合鍵
- 26. 如何處理這對新的對象
- 27. 有理數的散列碼
- 28. 處理對象
- 29. Angular.js從散列/對象
- 30. 在Java中散列對象?
鑰匙?是不是通過equals方法認爲鍵是不同的? (IEquatable)? –
@RoyiNamir:是的,但他們首先*通過哈希碼進行比較 - 因爲這樣可以便宜地獲得*潛力*匹配。否則,每次從字典中提取都需要檢查每個密鑰的均等性。 –
爲什麼編譯器會打擾做潛在的匹配,如果等於可以破壞它的假設? (我知道重寫等於要求重載getHashCode) - 但那是另一個問題。 –