由於只需要判斷到國家的緯度,所以不需要用到純真ip庫這樣龐大的ip庫,通過網上的查詢,發現有個中國ip段的列表
可以看到ip段有2k個左右,如果用二分查詢法,時間複雜度是logn。基本上能夠滿足需求了。
一、 整理ip段配置
為了方便ip進行比較,這裡將ip轉換為long格式。
把資料load進來,取第一第二行,ip2long處理
第一行儲存在left,第二行儲存在right中
然後根據left進行排序
最終得到的結果,如下:
<?php
#部分資料
array (
0 =>
array (
'left' => '16777472',
'right' => '16778239',
),1 =>
array (
'left' => '16779264',
'right' => '16781311',
),2 =>
array (
'left' => '16785408',
'right' => '16793599',
),3 =>
array (
'left' => '16842752',
'right' => '16843007',
),4 =>
array (
'left' => '16843264',
'right' => '16859135',
));
二、二分查詢法
function binarysearch(array $arr, $target)
#中元素比目標大,查詢左部
if($target < $arr[$mid]['left'] )
#中元素比目標小,查詢右部
if($target > $arr[$mid]['left'] )
}#查詢失敗
return false;
}
ip位址轉為long的最大值剛好是2^32-1 ,那麼在redis中我們剛好可以申請乙個4294967295的bitmap,占用記憶體為512m。
如果能夠把所有中國的ip對應的long都設定為1,那麼每次查詢都只要0(1),遇到的問題是redis的setbit怎麼批量設定呢?如果要乙個ip設定一次的話,需要設定3億次,這個比較難實現。。
判斷兩個IP是否屬於同一子網(20200309)
子網掩碼是用來判斷任意兩台計算機的ip位址是否屬於同一子網路的根據。子網掩碼與ip位址結構相同,是32位二進位制數,其中網路號部分全為 1 和主機號部分全為 0 利用子網掩碼可以判斷兩台主機是否中同一子網中。若兩台主機的ip位址分別與它們的子網掩碼相 與 後的結果相同,則說明這兩台主機在同一子網中。...
python 判斷乙個IP位址是否合法
最近在看tornado的原始碼,遇到了 is valid ip ip 這個函式,該函式用來判斷乙個ip位址是否合法,支援ipv4和ipv6,想到自己前陣子也遇到過這個問題,看著原始碼的解決方法要比自己的好多了,就摘抄下來,以留備用 def is valid ip ip returns true if...
sql判斷記錄是否屬於乙個區間(起點 終點)
遇到這麼乙個小問題,根據錄入的起點數值和終點數值到資料庫檢視錄入的這個區間在資料庫中是不是存在,這個問題其實就是乙個邏輯判斷,但是當時一下子沒像清楚。畫個圖看一下就明白了下面我用圖表示下 其中紅色表示資料庫中的值,黑色表示輸入的值,下面 起點 用qd表示,終點 用zd表示,輸起 用sq表示,輸終 用...