日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[译]C语言实现一个简易的Hash table(3)

發布時間:2023/12/18 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [译]C语言实现一个简易的Hash table(3) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上一章,我們講了hash表的數據結構,并簡單實現了hash表的初始化與刪除操作,這一章我們會講解Hash函數和實現算法,并手動實現一個Hash函數。

Hash函數

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

  • 輸入一個字符串,然后返回一個0到m(Hash表的大小)的數字
  • 為一組平常的輸入返回均勻的bucket索引。如果Hash函數不是均勻分布的,就會將多個記錄插入到相同的bucket中,這就回提高沖突的幾率,而這個沖突就會影響到我們的Hash表的效率。

Hash算法

我們將會設計一個普通的字符串Hash函數,在偽代碼中表示如下:

function hash(string, a, num_buckets):hash = 0string_len = length(string)for i = 0, 1, ..., string_len:hash += (a ** (string_len - (i+1))) * char_code(string[I])hash = hash % num_bucketsreturn 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) {long hash = 0;const int len_s = strlen(s);for (int i = 0; i < len_s; i++) {hash += (long)pow(a, len_s - (i+1)) * s[i];hash = hash % m;}return (int)hash; }

    什么是沖突?

    理想中的散列函數返回的結果都是均勻分布的,但是,對于任意一個散列函數,總會有一些輸入經過散列后,得到相同的值。如果要找到這組輸入,我們就需要測試大量的輸入數據。

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

    不好的輸入也存在安全問題,如果某個惡意用戶向哈希表提供了一組沖突密鑰,那么搜索這些密鑰將比正常情況(O(1))花費更長時間(O(n))。這可以用作針對以哈希表為基礎的系統(例如DNS和某些Web服務)的拒絕服務攻擊。

    上一章:Hash table數據結構
    下一章:沖突處理


    原文地址:https://github.com/jamesroutley/write-a-hash-table/tree/master/03-hashing

    轉載于:https://www.cnblogs.com/bilberry/p/10264535.html

    總結

    以上是生活随笔為你收集整理的[译]C语言实现一个简易的Hash table(3)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。