C語言實現乙個簡易的Hash table 三

2021-10-01 19:44:16 字數 1521 閱讀 1292

上一章,我們講了hash表的資料結構,並簡單實現了hash表的初始化與刪除操作,這一章我們會講解hash函式和實現演算法,並手動實現乙個hash函式。

本教程中我們實現的hash函式將會實現如下操作:

我們將會設計乙個普通的字串hash函式,在偽**中表示如下:

function hash(string, a, num_buckets):

hash = 0

string_len = length(string)

for i = 0, 1, ..., string_len:

hash += (a ** (string_len - (i+1))) * char_code(string[i])

hash = hash % num_buckets

return hash

這個hash函式主要分為兩步:

將字串轉為大整型

通過取餘數mod m將整數的大小減小到固定範圍

變數a是乙個素數,並且要大於英文本母,我們正在雜湊ascii字串,其字母大小為128,因此我們應該選擇大於此的素數。

char_code這個函式會返回字母對應的整數,使用的是ascii中的字母。

如下使用這個hash函式

hash("cat", 151, 53)

// 函式拆解

hash = (151**2 * 99 + 151**1 * 97 + 151**0 * 116) % 53

hash = (2257299 + 14647 + 116) % 53

hash = (2272062) % 53

hash = 5

如果改變a我們會得到不同的結果:

hash("cat", 163, 53) = 3
// hash_table.c

static int ht_hash(const char* s, const int a, const int m)

return (int)hash;

}

理想中的雜湊函式返回的結果都是均勻分布的,但是,對於任意乙個雜湊函式,總會有一些輸入經過雜湊後,得到相同的值。如果要找到這組輸入,我們就需要測試大量的輸入資料。

因為上面提到的有不好的輸入存在,意味著所有輸入都沒有完美的雜湊函式。所以在設計雜湊函式時,針對預期輸入,我們的雜湊函式需要表現最好。

不好的輸入也存在安全問題,如果某個惡意使用者向雜湊表提供了一組衝突金鑰,那麼搜尋這些金鑰將比正常情況(o(1))花費更長時間(o(n))。這可以用作針對以雜湊表為基礎的系統(例如dns和某些web服務)的拒絕服務攻擊。

C語言實現乙個簡易的掃雷2

ifndef game h define game h define crt secure no warnings 1 include include include include define rows 11 define cols 11 define count 10 void init bo...

C語言實現乙個簡易的Hash table 二

上一章,簡單介紹了hash table,並提出了本教程中要實現的幾個hash table的方法,有search a,k insert a,k,v 和delete a,k 本章將介紹hash table使用的資料結構。hash表中儲存的每一項key value的資料結構 hash table.h ty...

C語言實現乙個簡易的Hash table 六

上一章中,我們實現了hash表中的插入 搜尋和刪除介面,我們在初始化hash表時固定了大小為53,為了方便擴充套件,本章將介紹如何修改hash表的大小。現在,我們的hash表是固定大小 53 的,當插入越來越多資料時,我們的hash表就會被插滿,這個問題有兩個原因 雜湊表的效能隨著高衝突率而降低 我...