contributed by < cwl0429
>
1
記得將 map->ht 所有的 first 指標初始化,避免有存取安全疑慮
為何使用 GOLDEN RATIO 作為 hash function?
根據 Fibonacci Hashing 的說明,在作者設計的實驗中,fibonacci hashing 較傳統的 integer modulo 快了兩倍左右(在資料量大於 400000 時),圖表如下:
其中只有 ska::unordered_map 使用 fibonacci hashing
先藉由 key 找到對應的 hlist_head,接著在此 head 不斷往後找,直到有 key 相等或找完所有 hlist
原先的 code 缺少了 AAA 及 BBB 兩部分,以下是不加 AAA 及 BBB 的示意圖(圖表改自開發紀錄(quiz1),假設 hash key 為 n ):
可以看出,有兩條 link 沒有正確串接,分別是 n->next 和 n->pprev,於是將其補上,使其變成下面的圖表:
map->ht[0]
開始,先將此 slot 內的 hlist_node 逐一釋放,重複此動作,直到釋放完所有的 map->ht[MAP_HASH_SIZE]
需要注意的是,這段 code 使用到 goto 技巧,用以跳過 16~20 行,但我目前還沒想到何時會有 unhash 的狀況發生
想法是不斷地將 nums 的數放入 map 中,直到 map_get 找到正確的數進行回傳
研讀 Linux 核心原始程式碼 include/linux/hashtable.h 及對應的文件 How does the kernel implements Hashtables?,解釋 hash table 的設計和實作手法,並留意到 tools/include/linux/hash.h 的 GOLDEN_RATIO_PRIME,探討其實作考量
2
觀察 COND1
,此時需要進入 if 內做刪除重複 node 的動作,因此推斷 COND1
會需要 head->val == head->next->val
的條件,另外又需要考慮到若是 head->next
為 NULL 會產生問題,所以再將 head->next
加入判斷,於是得到結論
COND1:
head->next && head->val == head->next->val
再觀察 COND2
會發現需要的條件和 COND2
相同,所以
COND2:
head->next && head->val == head->next->val
利用指標的指標 **tmp
移除重複的 node,方便移除 node