c 中雜湊表的使用 鍵的問題

2021-05-21 21:54:35 字數 1877 閱讀 5928

在c#中,使用hashtable的關鍵是鍵和雜湊函式,hashtable根據鍵用雜湊函式生成value的雜湊**。在查詢的時候用key值根據同乙個雜湊函式生成雜湊**,並且搜尋與該雜湊**想關聯的value從而取出key對應的value。

在c# 的自定義物件中,有預設的gethashcode方法

。但gethashcode 方法的預設實現不保證針對不同的物件返回唯一值。而且,.net framework 不保證 gethashcode 方法的預設實現以及它所返回的值在不同版本的 .net framework 中是相同的。因此,在進行雜湊運算時,該方法的預設實現不得用作唯一物件識別符號。

gethashcode 方法可以由派生型別重寫。值型別必須重寫此方法,以提供適合該型別的雜湊函式和在雜湊表中提供有用的分布。為了獲得最佳結果,雜湊**必須基於例項欄位或 屬性(而非靜態欄位或屬性)的值。

用作 hashtable 物件中鍵的物件必須重寫 gethashcode 方法,因為這些物件必須生成其各自的雜湊**。如果用作鍵的物件不提供 gethashcode 的有用實現,您可以在構造 hashtable 物件時指定雜湊**提供程式。從 2.0 版開始,雜湊**提供程式基於 system.collections. iequalitycomparer 介面。

msdn中隊雜湊函式對實現者的說明:雜湊函式用於快速生成乙個與物件的值相對應的數字(雜湊**)。雜湊函式通常是特定於每個 type 的,而且,必須至少使用乙個例項字段作為輸入。

雜湊函式必須具有以下特點:

在c#中,string是內建型別, string 類提供的 gethashcode 方法的實現為相同的字串值返回相同的雜湊**。因此,如果兩個 string 物件表示相同的字串值,則它們返回相同的雜湊**。另外,該方法使用字串中的所有字元生成相當隨機的分布式輸出,即使當輸入集中在某些範圍內時(例 如,許多使用者可能有只包含低位 128 個 ascii 字元的字串,即使字串可以包含 65,535 個 unicode 字元中的任何字元)。

對於 object 的派生類,當且僅當此派生類將值相等性定義為引用相等並且型別不是值型別時,gethashcode 方法才可以委託給 object. gethashcode 實現。

在類上提供好的雜湊函式可以顯著影響將這些物件新增到雜湊表的效能。在具有好的雜湊函式實現的雜湊表中,搜尋元素所用的時間是固定的(例如運算複雜度為 o(1) 的運算)。而在具有不好的雜湊函式實現的雜湊表中,搜尋效能取決於雜湊表中的項數(例如運算複雜度為 o(n ) 的運算,其中的 n 是雜湊表中的項數)。雜湊函式的計算成本也必須不高。

gethashcode 方法的實現必須不會導致迴圈引用。例如,如果 classa.gethashcode 呼叫 classb.gethashcode ,classb.gethashcode 必須不直接或間接呼叫 classa.gethashcode 。

gethashcode 方法的實現必須不引發異常。

重寫 gethashcode 的派生類還必須重寫 equals , 以保證被視為相等的兩個物件具有相同的雜湊**;否則,hashtable 型別可能無法正常工作。

根據以上的描述,我得出兩個結論:

第一:在c# 中使用hashtable, 選擇string作為鍵(key)是比較合適的。用string作為key,不用自己去實現gethashcode方法而能獲得比較好的搜尋效能,對於使用雜湊函式比較困難的情況或者雜湊函式難以選擇的 情況比較合適。

第二: 如果鍵(key)必須是自定義型別,則必須選擇合適的雜湊函式並實現 gethashcode方法。在此種情況下,自定義中字段的選取與雜湊函式的選取一定要科學,雜湊效能要良好,否則hashtable的效能會大大下降。

c 中雜湊表的用法總結

原始出處 作者資訊和本宣告。否則將追究法律責任。雜湊表,可能對於很多同行來說已經很熟悉 剛開始接觸時有點陌生,後來用多了也就熟了 當然網上關於這乙個知識點的介紹很多,不過這並不妨礙我個人對此作出自己的總結與理解 在.net framework中,hashtable是system.collection...

C 中的雜湊表 Hashtable 應用

一.雜湊表 hashtable 簡述 在.net framework中,hashtable是system.collections命名空間提供的乙個容器,用於處理和表現類似key value的鍵值對,其中key通常可用來快速查詢,同時key是區分大小寫 value用於儲存對應於key的值。hashta...

C 中雜湊表的基本操作

一,雜湊表 hashtable 簡述 在.net framework中,hashtable是system.collections命名空間提供的乙個容器,用於處理和表現類似key value的鍵值對,其中key通常可用來快速查詢,同時key是區分大小寫 value用於儲存對應於key的值。hashta...