如何快速查詢IP歸屬地

haolujun發表於2013-08-22

這兩天遇到這麼一個問題,就是查詢一個IP的歸屬地。當然我會有一個IP段的分配列表,格式如下:

16777472    16778239    XX省 XX市

第一列是IP段的起始IP,第二列是IP段的終止IP,第三列是對應的省份。一共大概200萬條左右。

那麼好了,如何進行查詢呢?

想到的最簡單的辦法,就是二分查詢。首先對這些IP段進行首位相接的排序,之後一個二分查詢。那麼有沒有比這個還快的方法呢?

我們分析一下上面的二分查詢的一個缺點就是,要在所有的IP段上進行二分查詢,大概要查詢log(2000000)次才能找到一個IP的歸屬地。那麼我們一個自然的想法就是縮小二分的IP段的數量。可以這樣做:

根據IP的前兩個位元組,把IP段進行分組。之後在對要查詢的IP,首先根據IP的前兩個位元組,快速定位到某一個分組,之後在這個分組中進行查詢。由於分組後,每一個組中的IP段會少很多。所以這個方法要比赤裸裸的二分快50%左右。

左面代表所有兩位元組組合,每個單元都有兩個索引記錄其在右側陣列中的起始位置。起始位置之間的IP的前兩位元組都等於左側單元編號。

當來一個ip時, 首先計算ip >> 16,之後找到相應的索引區間,之後在相應的區間上進行查詢。

其實,第二中方法,就是一個以空間換時間的方法。如果記憶體放得下,我們完全可以計算出每個IP的對應的省和市,存放在一個大小為2^32次方的表中。在這裡,我們取了一個折中。

相關文章