fcl的設計者認為,如果能將任何物件的任何例項放到雜湊表集合中,能帶來很多好處。為此,system.object提供了虛方法gethashcode,它能獲取任意物件的int32雜湊碼。
如果你定義的型別重寫了equals方法,還應該重寫gethashcode方法。
型別定義equals之所以還要定義gethashcode,是由於system.collections.hashtable型別、system.collectionsgeneric.dictionary型別以及其他一些集合的實現中,要求兩個物件必須具有相同雜湊碼才被視為相等。所以,重寫了equals方法就必須重寫gethashcode方法,確保相等性演算法和物件雜湊碼演算法一致。
簡單地說,向集合新增鍵/值(key/calue)對,首先要獲取鍵物件的雜湊碼。該雜湊碼指出鍵/值對要儲存到那個雜湊桶(bucket)中。集合需要查詢鍵時,會獲取指定鍵物件的雜湊碼。該雜湊碼標識了現在要以順序方式搜尋的雜湊桶,將在其中查詢與指定鍵物件相等的鍵物件。採用這個演算法來儲存和查詢鍵,意味著一旦修改了集合中的乙個鍵物件。集合就再也找不到該物件。所以,需要修改雜湊表中的鍵物件時,正確做法是移除原來的鍵/值對,修改鍵物件,再將新的鍵/值對新增回雜湊表。
自定義gethashcode方法或許不是一件難事。但取決於資料型別和資料分布情況,可能並不容易設計出能返回良好分布值的雜湊演算法。
選擇演算法來計算型別例項的雜湊碼時,請遵守一下原則:
1.這個演算法要提供良好的隨機分布,使雜湊表獲得最佳效能。
2.可在演算法中呼叫基類的gethashcode方法,幷包含它的返回值。但一般不要呼叫object或valuetype的gethashcode方法,因為兩者的實現都與高效能雜湊演算法不沾邊。
3.演算法至少使用乙個例項字段。
4.理想情況下,演算法使用的字段應該不可變(immutable);也就是說,欄位應在物件構造時初始化,在物件生存期永不言變。
5.演算法執行速度盡量快。
6.包含相同值的不同物件應返回相同雜湊碼。
system.object實現的gethashcode方法對派生型別和其中的字段一無所知,所以返回乙個在物件生存期保證不變的編號。
C 物件雜湊碼
fcl的設計者認為,如果能將任何物件的任何例項放到雜湊集合中,能帶來很多好處。但是這裡說一點,還是會存在,雜湊碼類似的情況,這一點大型 架構這本書中有介紹,最好做下md5演算法.為此,system.object提供了gethashcode,它能獲取任何物件的int32雜湊碼.如果你定義的型別重寫了e...
Java基礎 理解雜湊與雜湊碼
1.從hashmap說起 我們知道map以鍵值對的形式來儲存資料。有一點值得說明的是,如果要使用我們自己的類作為鍵,我們必須同時重寫hashcode 和 equals 兩個方法。hashmap使用equals方法來判斷當前的鍵是否與表中的鍵相同。equals 方法需要滿足以下5個條件 2.雜湊雜湊的...
Redis 物件 雜湊物件
每種型別的變數至少使用了兩種不同的編碼 1 五種物件的底層編碼 字串型別物件 redis encoding int redis encoding embstr redis encoding raw 列表型別的物件 redis encoding ziplist redis encoding linke...