99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux內(nèi)核中的hash與bucket

Q4MP_gh_c472c21 ? 來(lái)源:未知 ? 作者:胡薇 ? 2018-06-12 14:53 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

哈希表(Hashtable)又稱(chēng)為“散列”,Hashtable是會(huì)根據(jù)索引鍵的哈希程序代碼組織成的索引鍵(Key)和值(Value)配對(duì)的集合。Hashtable 對(duì)象是由包含集合中元素的哈希桶(Bucket)所組成的。而B(niǎo)ucket是Hashtable內(nèi)元素的虛擬子群組,可以讓大部分集合中的搜尋和獲取工作更容易、更快速。

哈希函數(shù)(Hash Function)為根據(jù)索引鍵來(lái)返回?cái)?shù)值哈希程序代碼的算法。索引鍵(Key)是被存儲(chǔ)對(duì)象的某些屬性值(Value)。當(dāng)對(duì)象加入至 Hashtable時(shí),它存儲(chǔ)在與對(duì)象哈希程序代碼相符的哈希程序代碼相關(guān)的Bucket中。當(dāng)在Hashtable內(nèi)搜尋值時(shí),哈希程序代碼會(huì)為該值產(chǎn)生,并且會(huì)搜尋與該哈希程序代碼相關(guān)的Bucket。例如,student和teacher會(huì)放在不同的Bucket中,而dog和god會(huì)放在相同的 Bucket中。所以當(dāng)索引鍵是唯一從Hashtable獲取元素的性能時(shí)表現(xiàn)會(huì)較好。Hash的四大優(yōu)點(diǎn)如下所示。

·事先不需要排序。

·搜尋速度與數(shù)據(jù)多少無(wú)關(guān)。

·數(shù)字簽名的密碼技術(shù)保密性(Security)高。

·可做數(shù)據(jù)壓縮(Data Compression),以節(jié)省空間。

Linux內(nèi)核里的哈希表應(yīng)用非常廣泛,PHP內(nèi)核里大部分語(yǔ)言特性也是基于哈希表實(shí)現(xiàn)的。為什么哈希表能這么神通廣大?哈希表能夠?qū)崿F(xiàn)高效的數(shù)據(jù)存儲(chǔ)和查找,而存儲(chǔ)和查找是編程中應(yīng)用最廣泛的兩個(gè)操作。

Linux內(nèi)核里的哈希表

讀過(guò)Linux內(nèi)核源碼的人可能都會(huì)發(fā)現(xiàn),其中并沒(méi)有太多復(fù)雜的數(shù)據(jù)結(jié)構(gòu),作為基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)的雙向鏈表(list)和基于list實(shí)現(xiàn)的hash表占據(jù)了絕大部分?jǐn)?shù)據(jù)結(jié)構(gòu)。內(nèi)核為什么會(huì)大量使用這兩種數(shù)據(jù)結(jié)構(gòu)呢?圍繞這個(gè)問(wèn)題(主要是hash表),我將以自己的理解揣摩一下其意圖。

首先,這兩種數(shù)據(jù)結(jié)構(gòu)都十分簡(jiǎn)單,簡(jiǎn)單包括理解起來(lái)簡(jiǎn)單和使用起來(lái)簡(jiǎn)單兩方面內(nèi)容。這也意味著代碼的可讀性和可維護(hù)性都比其他復(fù)雜的數(shù)據(jù)結(jié)構(gòu)要好,出現(xiàn)bug的風(fēng)險(xiǎn)也較低。從哲學(xué)上來(lái)講,這也符合K.I.S.S.條款。

其次,內(nèi)核是一個(gè)比較講究性能的軟件,為了程序設(shè)計(jì)和維護(hù)的簡(jiǎn)單性而失掉性能,這究竟是不是算得不償失呢?我們是不是應(yīng)該將天平更加偏向于性能?已經(jīng)記不起是在哪里聽(tīng)說(shuō)過(guò),很多商業(yè)的路由軟件都是基于二叉樹(shù)的數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)路由項(xiàng),以求得其路由查找的時(shí)間復(fù)雜度為log(n),并且他批評(píng)Linux的路由項(xiàng)組織為hash表,致使性能不佳,不適合商業(yè)。確實(shí)有一定道理,可仔細(xì)分析,hash表的性能真的比二叉樹(shù)差么?二叉樹(shù)的插入和刪除某一項(xiàng)的時(shí)間復(fù)雜度都為log(n);hash表插入和刪除的時(shí)間復(fù)雜度最好為O(1),最差為O(n),如果選取的表項(xiàng)(m)足夠多,且hash函數(shù)足夠好的話(huà),其時(shí)間復(fù)雜度為O(n/m)(當(dāng)m<=n時(shí))。當(dāng)m > n / log(n)的時(shí)候,hash表的平均表現(xiàn)就比二叉樹(shù)要好;且當(dāng)m>=n時(shí),其時(shí)間復(fù)雜度趨近于O(1)。m的值可以做成可調(diào)整的,這也正顯示了內(nèi)核的可定制性。不過(guò),不要盲目樂(lè)觀,這一切都是以一個(gè)足夠好的hash函數(shù)為前期的。

hash函數(shù)的優(yōu)劣

如何判定一個(gè)hash函數(shù)的好壞呢?

hash的中文意思是“散列”,可解釋為:分散排列。一個(gè)好的hash函數(shù)應(yīng)該做到對(duì)所有元素平均分散排列,盡量避免或者降低他們之間的沖突(Collision)。有必要再次提醒大家的是,hash函數(shù)的選擇必須慎重,如果不幸所有的元素之間都產(chǎn)生了沖突,那么hash表將退化為鏈表,其性能會(huì)大打折扣,時(shí)間復(fù)雜度迅速降為O(n),絕對(duì)不要存在任何僥幸心理,因?yàn)槟鞘窍喈?dāng)危險(xiǎn)的。歷史上就出現(xiàn)過(guò)利用Linux內(nèi)核hash函數(shù)的漏洞,成功構(gòu)造出大量使hash表發(fā)生碰撞的元素,導(dǎo)致系統(tǒng)被DoS,所以目前內(nèi)核的大部分hash函數(shù)都有一個(gè)隨機(jī)數(shù)作為參數(shù)進(jìn)行摻雜,以使其最后的值不能或者是不易被預(yù)測(cè)。這又對(duì) hash函數(shù)提出了第二點(diǎn)安全方面的要求:hash函數(shù)最好是單向的,并且要用隨機(jī)數(shù)進(jìn)行摻雜。提到單向,你也許會(huì)想到單向散列函數(shù)md4和md5,很不幸地告訴你,他們是不適合的,因?yàn)閔ash函數(shù)需要有相當(dāng)好的性能。

一籌莫展了吧?誰(shuí)叫你又想閉門(mén)造車(chē)了!還是看看前輩們是如何做的,充分發(fā)揚(yáng)拿來(lái)主義的精神,我又稱(chēng)這種做法為“不戰(zhàn)而屈人之兵”,這難道不是兵家之上上策么?Linux內(nèi)核里面用的jhash是一個(gè)久經(jīng)考驗(yàn),并被實(shí)踐證明經(jīng)得起考驗(yàn)的hash函數(shù),可以CPMS(Copy Paste Modify Save)之。Jhash的作者Bob Jenkins在其網(wǎng)站上還公布了諸如針對(duì)能預(yù)知的數(shù)據(jù)進(jìn)行hash的hash函數(shù)--完美(perfect)hash函數(shù)等一系列其他hash函數(shù),看客們可以選擇之,如果有興趣繼續(xù)鉆研,也可以踏在他們的肩膀上。

什么是bucket

bucket的英文解釋?zhuān)?/p>

Hash table lookup operations are often O(n/m) (where n is the number of objects in the table and m is the number of buckets), which is close to O(1), especially when the hash function has spread the hashed objects evenly through the hash table, and there are more hash buckets than objects to be stored.

可以這樣理解:

一個(gè)HASH的結(jié)果所對(duì)應(yīng)的地址可存放兩個(gè)BUCKET。可解決HASH沖突。

·要存數(shù)據(jù)時(shí),第一次HASH到這里,在第一個(gè)BUCKET存放一個(gè)數(shù)據(jù)。

·要存數(shù)據(jù)時(shí),當(dāng)?shù)诙我蚰承┰騂ASH到這里時(shí),在第二個(gè)BUCKET存放另一個(gè)數(shù)據(jù)。

一個(gè)由5個(gè)buckets組成的哈希表,里面有7個(gè)元素:

linux的hash函數(shù)hash_long等,用了golden ratio來(lái)計(jì)算。因?yàn)橥?bits)的數(shù)量需要由hash函數(shù)和對(duì)沖突的期望來(lái)決定,那么對(duì)于hash_long這樣的hash函數(shù),我們?cè)趺创_定桶的數(shù)量呢?

一般情況下都是自己根據(jù)數(shù)據(jù)特性來(lái)考慮使用的 hash 算法,不是千篇一律咬死一個(gè)不放。

比如存放 IP 地址的 hash table,用一個(gè) 65536 的桶就很好,把 IP 的后 16bit 作為 key。這種方法絕對(duì)比 hash_long、jhash 等函數(shù)的碰撞率低。

其實(shí)就是這個(gè)界和性能的折中。我可以取我問(wèn)題空間的最大值。這樣肯定能保證鍵值分散。但是這樣會(huì)浪費(fèi)很多空間。然而取得太小,又影響查找效率。感覺(jué)還是要在試驗(yàn)中進(jìn)行測(cè)試。而且個(gè)人覺(jué)得,hash比其他搜索的數(shù)據(jù)結(jié)構(gòu)靈活的地方就是它的可定制性??梢愿鶕?jù)具體情況調(diào)整,以達(dá)到最優(yōu)的效果。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11509

    瀏覽量

    213683
  • Hash
    +關(guān)注

    關(guān)注

    0

    文章

    32

    瀏覽量

    13480
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux內(nèi)核container_of原理詳解

    Linux內(nèi)核中經(jīng)??梢?jiàn)container_of的身影,它在實(shí)際驅(qū)動(dòng)的編寫(xiě)也是廣泛應(yīng)用。
    發(fā)表于 07-14 15:19 ?518次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>中</b>container_of原理詳解

    Linux內(nèi)核教程

    本章學(xué)習(xí)目標(biāo)掌握LINUX內(nèi)核版本的含義理解并掌握進(jìn)程的概念掌握管道的概念及實(shí)現(xiàn)了解內(nèi)核的數(shù)據(jù)結(jié)構(gòu)了解LINUX內(nèi)核的算法掌握
    發(fā)表于 04-10 16:59 ?0次下載

    hash表的實(shí)現(xiàn)原理

    軟件開(kāi)發(fā),一個(gè)hash表相當(dāng)于把n個(gè)key隨機(jī)放入到b個(gè)bucket,以實(shí)現(xiàn)n個(gè)數(shù)據(jù)在b個(gè)單位空間的存儲(chǔ)。 我們發(fā)現(xiàn)hash
    發(fā)表于 09-28 14:31 ?0次下載
    <b class='flag-5'>hash</b>表的實(shí)現(xiàn)原理

    Linux內(nèi)核配置系統(tǒng)詳解

    隨著 Linux 操作系統(tǒng)的廣泛應(yīng)用,特別是 Linux 在嵌入式領(lǐng)域的發(fā)展,越來(lái)越多的人開(kāi)始投身到 Linux 內(nèi)核級(jí)的開(kāi)發(fā)。面對(duì)日益龐
    發(fā)表于 11-01 15:45 ?4次下載

    linux內(nèi)核是什么_linux內(nèi)核學(xué)習(xí)路線

    Linux內(nèi)核是一個(gè)操作系統(tǒng)(OS)內(nèi)核,本質(zhì)上定義為類(lèi)Unix。它用于不同的操作系統(tǒng),主要是以不同的Linux發(fā)行版的形式。Linux
    發(fā)表于 09-16 15:49 ?2839次閱讀

    linux內(nèi)核參數(shù)設(shè)置_linux內(nèi)核的功能有哪些

    本文主要闡述了linux內(nèi)核參數(shù)設(shè)置及linux內(nèi)核的功能。
    發(fā)表于 09-17 14:40 ?1512次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>內(nèi)核</b>參數(shù)設(shè)置_<b class='flag-5'>linux</b><b class='flag-5'>內(nèi)核</b>的功能有哪些

    最硬核的Linux內(nèi)核文章

    來(lái)源 :頭條號(hào)@Linux學(xué)習(xí)教程,冰凌塊兒 01 前言 本文主要講解什么是Linux內(nèi)核,以及通過(guò)多張圖片展示Linux內(nèi)核的作用與功能,
    的頭像 發(fā)表于 10-19 17:46 ?2349次閱讀
    最硬核的<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>文章

    快速理解什么是Linux內(nèi)核以及Linux內(nèi)核的內(nèi)容

    01 前言 本文主要講解什么是Linux內(nèi)核,以及通過(guò)多張圖片展示Linux內(nèi)核的作用與功能,以便于讀者能快速理解什么是Linux
    的頭像 發(fā)表于 10-21 12:02 ?4551次閱讀
    快速理解什么是<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>以及<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>的內(nèi)容

    linux內(nèi)核的driver_register介紹

    linux內(nèi)核注冊(cè)驅(qū)動(dòng)由driver_register()完成。它將驅(qū)動(dòng)程序的信息添加到內(nèi)核的驅(qū)動(dòng)程序列表,使得內(nèi)核能夠在需要時(shí)與該驅(qū)動(dòng)
    的頭像 發(fā)表于 07-14 09:17 ?3706次閱讀
    <b class='flag-5'>linux</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>中</b>的driver_register介紹

    Linux內(nèi)核分析 端口哈希桶

    是用來(lái)封裝各種協(xié)議的綁定哈希表,具體定義如下所示,這個(gè)結(jié)構(gòu)體在[Linux內(nèi)核角度分析服務(wù)器Listen細(xì)節(jié)中介紹過(guò),具體地,struct inet_bind_hashbcket是bind相關(guān)的哈希桶
    的頭像 發(fā)表于 07-31 11:03 ?1084次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>分析 端口哈希桶

    linux內(nèi)核源代碼詳解

     在安裝好的Linux系統(tǒng),內(nèi)核的源代碼位于/ust/src/linux.如果是從GNU網(wǎng)站下載的Linux
    發(fā)表于 09-06 17:01 ?4次下載

    hash算法在FPGA的實(shí)現(xiàn)(1)

    在FPGA的設(shè)計(jì),尤其是在通信領(lǐng)域,經(jīng)常會(huì)遇到hash算法的實(shí)現(xiàn)。hash算法在FPGA的設(shè)計(jì),它主要包括2個(gè)部分,第一個(gè)就是如何選擇一個(gè)好的h
    的頭像 發(fā)表于 09-07 17:01 ?1675次閱讀
    <b class='flag-5'>hash</b>算法在FPGA<b class='flag-5'>中</b>的實(shí)現(xiàn)(1)

    hash算法在FPGA的實(shí)現(xiàn)(2)

    在前面的文章hash算法在FPGA的實(shí)現(xiàn)(一)——hash表的組建,記錄了關(guān)于hash表的構(gòu)建,這里記錄另外一個(gè)話(huà)題,就是
    的頭像 發(fā)表于 09-07 17:02 ?1354次閱讀
    <b class='flag-5'>hash</b>算法在FPGA<b class='flag-5'>中</b>的實(shí)現(xiàn)(2)

    使用 PREEMPT_RT 在 Ubuntu 構(gòu)建實(shí)時(shí) Linux 內(nèi)核

    盟通技術(shù)干貨構(gòu)建實(shí)時(shí)Linux內(nèi)核簡(jiǎn)介盟通技術(shù)干貨Motrotech如果需要在Linux實(shí)現(xiàn)實(shí)時(shí)計(jì)算性能,進(jìn)而有效地將Linux轉(zhuǎn)變?yōu)镽T
    的頭像 發(fā)表于 04-12 08:36 ?3671次閱讀
    使用 PREEMPT_RT 在 Ubuntu <b class='flag-5'>中</b>構(gòu)建實(shí)時(shí) <b class='flag-5'>Linux</b> <b class='flag-5'>內(nèi)核</b>

    Linux內(nèi)核的頁(yè)面分配機(jī)制

    Linux內(nèi)核是如何分配出頁(yè)面的,如果我們站在CPU的角度去看這個(gè)問(wèn)題,CPU能分配出來(lái)的頁(yè)面是以物理頁(yè)面為單位的。也就是我們計(jì)算機(jī)中常講的分頁(yè)機(jī)制。本文就看下Linux
    的頭像 發(fā)表于 08-07 15:51 ?635次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>中</b>的頁(yè)面分配機(jī)制