從物聯網防火牆himqtt源碼談哈希和紅黑樹的應用場景區別linux
himqtt是首款完整源碼的高性能MQTT物聯網防火牆 - MQTT Application FireWall,C語言編寫,不少數據結構適合初學者收藏。git
哈希和紅黑樹的詳細教程不少,本文就不重複了,但初學者每每雲裏霧裏,不知道實戰項目該用誰,今天筆者就從結合himqtt的源碼,從物聯網安全角度來對比一下哈希數據結構和紅黑樹的應用場景。github
哈希(hash)也稱散列,經過散列算法變成固定的輸出到數組,全部的線性數據結構中,數組的定位速度最快,由於它可經過數組下標直接定位到相應的數組空間,就不須要一個個查找。算法
紅黑樹的自旋是天才的設計,是一種特殊的平衡二叉樹數據結構,特色也是從幾十萬的數據裏面幾步就能查找到,速度快。數組
首先github上下載源碼,https://github.com/qq4108863/himqtt ,在src\waf目錄有hashmap.c和mqtt_rbtree.c ,分別是哈希和紅黑樹算法。安全
物聯網多是數百萬設備聯網,對高併發要求很大,因此,對網絡安全產品第一要求的是性能和速度。整體來講,哈希查找速度會比紅黑樹快,並且查找速度基本和數據量大小無關,屬於常數級別;而RB樹的查找速度是log(n)級別。服務器
紅黑樹查找和刪除的時間複雜度都是O(logn),Hash查找和刪除的時間複雜度都是O(1)。 若是紅黑樹的樹高度不深如小於8,採用的是整形數字查找,二者性能沒有太多的差別。網絡
也就是並不是全部的場景,哈希都比紅黑樹快,要看代碼的優化程度。himqtt使用的linux高併發EPOLL模式事件管理,就是紅黑樹。數據結構
靜態數據,能夠基本預知大小,用哈希。如himqtt初始化的攻擊規則就幾百條在可控範圍內,另外TOPIC黑白名單、URL地址等也不會太多,也是用的哈希就能夠了。併發
動態數據,如統計IP地址、任務調度、epoll高併發事件管理,沒法判斷多少,可能不多,也可能巨多,用紅黑樹更佳。固然,若是大概知道設備IP地址數量在必定範圍,如只有幾千,徹底也能夠用哈希。
對內存要求嚴格的地方,如嵌入式系統,用紅黑樹。紅黑樹佔用的內存更小(僅須要爲其存在的節點分配內存),而哈希事先就應該分配足夠的內存存儲散列表,浪費內存。
對內存消耗無所謂的地方,如服務器有巨大的內存,用哈希。哈希最大的缺點是內存分配得小,可能元素就會衝突,衝突的元素大於8個成鏈表,效率還不如紅黑樹。 Java 的hashmap就是把哈希和紅黑樹結合在之前的。當同一個hash值的節點數不小於8時,再也不採用單鏈表形式存儲,而是採用紅黑樹。
哈希更簡單,紅黑樹算法複雜一點,不過這都不是事,大神早開源了不少穩定的版本。
紅黑樹是有序的,哈希是無序的,根據項目需求來選擇,阿里巴巴的不少項目用紅黑樹更多,筆者認爲主要仍是和內存有關,若是內存要求苛刻的項目,就用紅黑樹;若是內存足夠大,犧牲內存換取更快的速度,哈希徹底適合。
himqtt開源版大量採用哈希算法,可能和速度併發要求有關。總之,數據結構是物聯網安全最基礎的學科。