glib中hash表函式的使用 ghash

2021-08-31 04:14:47 字數 1082 閱讀 9242

在使用ghash看其文件時對insert的介紹是如果key值相同的value再插入時會被替換,對於判斷key值相等的標準不太清楚,是hash值相等的話發生hash碰撞時不就麻煩了,於是結合文件以及其源**,自己寫**做了下驗證,結果如下文描述。

1.建立新hash表:

ghashtable* g_hash_table_new (ghashfunc hash_func,

gequalfunc key_equal_func);

第乙個函式用來把key轉換成hash值;第二個函式用來精確確認key。

hash_func說明:

"str1", "str2", "str3", "str11" 這是4個key串

自定義乙個hash_func,將串的第4個字元轉換成數字作為hash值,那麼對應得到4個hash值分別是:

1, 2, 3, 1

key_equal_func的呼叫時機(以上面的hash_func來說明):

1.向表中新增新元素時可能會呼叫:(當不同的key產生了同樣的hash值,發生了碰撞時會呼叫)

(1)插入key值"str1"以及其對應的value,此時hash值1在表中是唯一的,不會呼叫

(2) 插入"str2", "str3",hash值2,3仍然時唯一的,不會呼叫

(3) 插入"str11",其hash值為1,但是位置1已經有內容了,此時就會呼叫key_equal_func,來判斷這兩個key值是不是真的一樣。如果 key_equal_func()返回true,那麼認為這兩個key值是一樣的,原來的value就會被替換掉。如果返回false,那麼就會作為乙個新元素插入,雖然他們兩個配對key的hash值是一樣的。如果大量這樣的情況發生,就是hash_func函式選擇的不好了。(glib中自帶了一些 hash函式,這些可以看文件)

2.查詢表中的元素時肯定會呼叫:

比如要查詢"str11"對應的value,會首先計算其hash值為1,然後在hash表中查詢對應此hash值的元素,可能有多個,為了確認是不是自己要找的,所以會呼叫key_equal_func(),如果返回true,表示確實是這個key對應的元素,如果返回false,那麼說明雖然hash 值一樣,但是實際key並不一樣,這個元素不是要找的。

hash表的使用

事實上不管使用陣列還是鍊錶儲存資料都會存在較大缺陷,當你使用陣列時,難於刪除和新增資料 當你使用鍊錶時難於查詢資料 因此hash表綜合了兩者的優缺點,使的查詢和新增等操作既不至於複雜也不至於簡單。因此hash表的原理可以是陣列中存鍊錶,鍊錶上存資料 簡單的建立方式如下 public class hn...

Hash表的使用

hash表能夠實現在o 1 時間內對資料訪問,雖然空間複雜度很高,但是時間複雜度很好。所以下面說一些使用hash的演算法。利用hash可以實現統計字元的個數,然後在遍歷一次得到最早的那個只出現一次的字元。注意 如果傳入的字串為null或者字串裡沒有只出現一次的字元,這兩種情況都要返回 1。int f...

Delphi中Hash表的使用方法

在遊戲開發中經常需要儲存一些資料結構,並且在使用的時候需要快速的查詢出來.hash表正是為了提高檢索速度而設計出來的.下面我就將我在用delphi開發中使用hash表的方法寫出來,希望對大家有一定的幫助 在delphi中有乙個thashedstringlist類,使用這個類可以實現hash表的操作....