用何種資料結構儲存大量IP四元組能夠獲得較高的查詢效率?

時間 2021-05-31 13:50:37

1樓:

2樓:Jake

其實乙個乙個比較查詢效率肯定夠用,如果一定要用高大上的資料結構,個人感覺上hash最快,這個是肯定的,一共才20來bytes大小,網上找個快點的hash方法是沒問題的。

3樓:陳碩

Linux kernel 用的是乙個 hash table (Linux/include/net/inet_hashtables.h),插入函式 inet_ehash_insert,其 hash function 是 __inet_ehashfn。注意 local port 是 host endian,其餘是 network endian。

ehash 的初始化在 Linux/net/ipv4/tcp.c,注意其buckets數目是kernel啟動時設定的 thash_entries,沒有rehash功能。

4樓:Coldwings

hash碰撞率高的話重新設計一下hash函式就好……不存在不能用的。

然後來估算效率。ip乙個32位,埠16位,兩組共96位的狀態空間。2^96很大,私以為大多數應用中幾乎不可能用到超過2^30組的情況。

如果用任何搜尋樹進行處理,複雜度與節點總數直接相關;用hash的話則與hash方法有關,然而總計12個位元組的狀態描述進行hash,在上述規模2^30條記錄的情況下,與任何搜尋樹的效能差應當是不大的。

redix tree也是個logn級的時間複雜度;hash是常數級與hash函式複雜度有關。如果只是用庫,自己試試就好。如果願意研究演算法,建議學會分析時間複雜度。

5樓:靈劍

這是取決於你做什麼樣的查詢啊,你如果要五元組精確匹配,那肯定是Hash效率最高。但是字首樹是用來解決字首查詢的問題的,給乙個CIDR然後查詢所有匹配的IP位址,或者反過來,給一堆CIDR然後查詢IP對應的CIDR,這些你用Hash是解決不了的。字典樹字首查詢的效率最壞情況下也是常數,無非常數大小的問題,其實沒有什麼變壞的問題。

問題還是在於需求,如果是五元組,某些需求其實不是字首查詢,比如說防火牆源IP和目的IP都是CIDR,然後跟給定的源IP、目的IP匹配,這並不是個字首查詢的問題,因為可能有多個源CIDR都跟給定的源IP匹配,這種時候就需要設計新的演算法來配合這些資料結構了。

Grasshopper 有多少種資料結構?每種資料是怎樣運算的?

GH只有一種樹形資料結構,就是列表。資料結構是樹形,描述結構的資料格式 0,0,0 左側是根,右側是枝,越往右側,列表層級越深。但是深度級別示方法和DY相反。DY是這樣滴 關於怎麼運算,可以看Rhino原廠教程。我貼下我學GH時候的筆記 一開始GH的資料結構運算是有3種方法 對齊最短,對齊最長,叉積...

公交路線如何使用資料結構儲存?

以帶時刻表的火車線路查詢為例,介紹圖的設計,不帶時刻表的話會簡單很多 節點結構 包含時間和地點兩個資訊 以及節點 地點型別 比如5 00在地點 經緯度 X,6 00在A車站門口,6 30在火車上B站 節點型別可能包括 任意的座標XY,車站前,火車上某站 連線結構 包含起始節點,終結節點,費用 以及連...

請問 Redis究竟有幾種資料結構?分別有什麼特點?

華為雲開發者社群 Redis是一款基於鍵值對的NoSQL資料庫,它的值支援多種資料結構 字串 strings 雜湊 hashes 列表 lists 集合 sets 有序集合 sorted sets 等。下面詳細來看一下 資料結構 struct sdshdr 常見操作 127.0.0.1 6379 s...