www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]哈希表(Hashtable)又稱為“散列”,Hashtable是會根據(jù)索引鍵的哈希程序代碼組織成的索引鍵(Key)和值(Value)配對的集合。Hashtable 對象是由包含集合中元素的哈希桶(Bucket)所組成的。而Bucket是Hashtable內(nèi)元素的虛擬子群組,可以讓大部分集合中的搜尋和獲取工作更容易、更快速。

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

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

· 事先不需要排序。

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

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

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

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

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

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

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

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

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

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

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

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

什么是bucket

bucket的英文解釋:

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.

可以這樣理解:

一個HASH的結(jié)果所對應(yīng)的地址可存放兩個BUCKET??山鉀QHASH沖突。

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

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

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

linux的hash函數(shù)hash_long等,用了golden ratio來計算。因為桶(bits)的數(shù)量需要由hash函數(shù)和對沖突的期望來決定,那么對于hash_long這樣的hash函數(shù),我們怎么確定桶的數(shù)量呢?

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

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

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

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

CPU親和度通過限制進(jìn)程或線程可以運行的CPU核心集合,使得它們只能在指定的CPU核心上執(zhí)行。這可以減少CPU緩存的失效次數(shù),提高緩存命中率,從而提升系統(tǒng)性能。

關(guān)鍵字: Linux 嵌入式

在Linux系統(tǒng)性能優(yōu)化中,內(nèi)存管理與網(wǎng)絡(luò)連接處理是兩大核心領(lǐng)域。vm.swappiness與net.core.somaxconn作為關(guān)鍵內(nèi)核參數(shù),直接影響系統(tǒng)在高負(fù)載場景下的穩(wěn)定性與響應(yīng)速度。本文通過實戰(zhàn)案例解析這兩個...

關(guān)鍵字: Linux 內(nèi)存管理

對于LLM,我使用b谷歌Gemini的免費層,所以唯一的成本是n8n托管。在使用了n8n Cloud的免費積分后,我決定將其托管在Railway上(5美元/月)。然而,由于n8n是開源的,您可以在自己的服務(wù)器上托管它,而...

關(guān)鍵字: 人工智能 n8n Linux

在Linux系統(tǒng)管理中,權(quán)限控制是安全運維的核心。本文通過解析/etc/sudoers文件配置與組策略的深度應(yīng)用,結(jié)合某金融企業(yè)生產(chǎn)環(huán)境案例(成功攔截98.7%的非法提權(quán)嘗試),揭示精細(xì)化權(quán)限管理的關(guān)鍵技術(shù)點,包括命令別...

關(guān)鍵字: Linux 用戶權(quán)限 sudoers文件

Linux內(nèi)核中的信號量(Semaphore)是一種用于資源管理的同步原語,它允許多個進(jìn)程或線程對共享資源進(jìn)行訪問控制。信號量的主要作用是限制對共享資源的并發(fā)訪問數(shù)量,從而防止系統(tǒng)過載和數(shù)據(jù)不一致的問題。

關(guān)鍵字: Linux 嵌入式

在云計算與容器化技術(shù)蓬勃發(fā)展的今天,Linux網(wǎng)絡(luò)命名空間(Network Namespace)已成為構(gòu)建輕量級虛擬網(wǎng)絡(luò)的核心組件。某頭部互聯(lián)網(wǎng)企業(yè)通過命名空間技術(shù)將測試環(huán)境資源消耗降低75%,故障隔離效率提升90%。本...

關(guān)鍵字: Linux 云計算

在Linux內(nèi)核4.18+和主流發(fā)行版(RHEL 8/Ubuntu 20.04+)全面轉(zhuǎn)向nftables的背景下,某電商平臺通過遷移將防火墻規(guī)則處理效率提升40%,延遲降低65%。本文基于真實生產(chǎn)環(huán)境案例,詳解從ipt...

關(guān)鍵字: nftables Linux

在Linux設(shè)備驅(qū)動開發(fā)中,等待隊列(Wait Queue)是實現(xiàn)進(jìn)程睡眠與喚醒的核心機制,它允許進(jìn)程在資源不可用時主動放棄CPU,進(jìn)入可中斷睡眠狀態(tài),待資源就緒后再被喚醒。本文通過C語言模型解析等待隊列的實現(xiàn)原理,結(jié)合...

關(guān)鍵字: 驅(qū)動開發(fā) C語言 Linux

在Unix/Linux進(jìn)程間通信中,管道(pipe)因其簡單高效被廣泛使用,但默認(rèn)的半雙工特性和無同步機制容易導(dǎo)致數(shù)據(jù)競爭。本文通過父子進(jìn)程雙向通信案例,深入分析互斥鎖與狀態(tài)機在管道同步中的應(yīng)用,實現(xiàn)100%可靠的數(shù)據(jù)傳...

關(guān)鍵字: 管道通信 父子進(jìn)程 Linux

RTOS :RTOS的核心優(yōu)勢在于其實時性。它采用搶占式調(diào)度策略,確保高優(yōu)先級任務(wù)能夠立即獲得CPU資源,從而在最短時間內(nèi)完成處理。RTOS的實時性是通過嚴(yán)格的時間管理和任務(wù)調(diào)度算法實現(xiàn)的,能夠滿足對時間敏感性要求極高的...

關(guān)鍵字: Linux RTOS
關(guān)閉