本篇講解如何快速判斷 IPV4 位址是否在大陸境内的 IP 位址。
中國 IPV4 的位址現在大約是 3 億 4 千萬個。
github 倉庫位址,源碼和 ip 位址都在裡面。github.com/chenhaoxian…
目前最新是 2019 年 11 月 30 日,境内所有 ip 範圍。
後面會持續更新和維護
歡迎大夥 star
最簡單方法,消耗大量記憶體,土豪方法。
在記憶體中将 3 億 4 千萬 IP 全部存儲到 Set 中。
如果按照 32 個位元組一個 IP 來算,大約需要 10G 左右。
這種方法就不進行介紹了。
将 IP 進行拆分為 4 段。a、b、c、d 段
分段進行比對,相較于方法一可以節省 3/4 的空間,但是需要的記憶體還是很大。
按照樹形結構進行存儲,a 比對才進行 b 的比對,b 比對再進行 c 的比對,依次比對
隻有 abcd 段完全比對才說明 IP 在集合中
通過 CIDR 格式表示的 IPV4 位址範圍進行處理
CIDR 及位址塊計算
IP 位址表示法:
IP 位址 ::= {<網絡字首>,< 主機号 >}/ 網絡字首所占位數 (斜線表示法)
CIDR 表示法給出任何一個 IP 位址就相當于給出了一個 CIDR 位址塊,實作了路由的聚合
使用該方法,CIDR 格式表示的 IPV4 位址塊隻有幾萬,存儲完全是夠的。
通過存儲 CIDR 的 IPV4 開始與結束,再将實際的 IP 進行比較是否在 CIDR 的塊中,即可判斷出 IP 是否在 IP 集合中
詳情不進行講解了,個人覺得使用這種方式較為麻煩,因為有着更加簡便的方法
是我目前所知最好的一種判斷 IP 是否在某些 IP 範圍内的最好方式,如果您有更好方式,歡迎評論
我們可以知道,通過 32 位位元組便可以存儲一個 IP 位址,32 位位元組可以轉換為 long 數字,按照方法三的思路,如果使用範圍的方式查找 ip 位址,那麼需要的存儲空間是非常小的,且效率也非常高。
那麼,可以将 CIDR 表示的 IP 位址塊通過存儲起始 IP 數字以及其後的範圍數字即可(或者存儲起始數字和結束數字)