日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

判断一个IP是否归属于中国

發(fā)布時間:2024/4/17 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 判断一个IP是否归属于中国 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

業(yè)務的要求

  • 判斷一個IP是不是屬于中國的
  • 時間復雜度盡量小,適用于請求量大的業(yè)務場景
  • 不要請求第三方接口,防止出現(xiàn)網(wǎng)絡異常

由于只需要判斷到國家的緯度,所以不需要用到純真IP庫這樣龐大的IP庫,通過網(wǎng)上的查詢,發(fā)現(xiàn)有個中國IP段的列表
http://ipblock.chacuo.net/down/t_txt=c_CN
可以看到IP段有2K個左右,如果用二分查詢法,時間復雜度是logN。基本上能夠滿足需求了。

實現(xiàn)步驟

一、 整理IP段配置

為了方便IP進行比較,這里將IP轉(zhuǎn)換為long格式。

  • 把數(shù)據(jù)load進來,取第一第二行,ip2long處理
  • 第一行保存在left,第二行保存在right中
  • 然后根據(jù)left進行排序
  • 最終得到的結(jié)果,如下:

    <?php #部分數(shù)據(jù) 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) {$low = 0;$high = count($arr) - 1;while($low <= $high) {$mid = floor(($low + $high) / 2);#找到元素if($target>=$arr[$mid]['left'] && $target<=$arr[$mid]['right']){return true;}#中元素比目標大,查找左部if($target < $arr[$mid]['left'] ){$high = $mid - 1;}#中元素比目標小,查找右部if($target > $arr[$mid]['left'] ){$low = $mid + 1;}}#查找失敗return false; }

    bitmap算法是否可行?

    ip地址轉(zhuǎn)為long的最大值剛好是2^32-1 ,那么在redis中我們剛好可以申請一個4294967295的bitmap,占用內(nèi)存為512M。
    如果能夠把所有中國的IP對應的long都設置為1,那么每次查詢都只要0(1),遇到的問題是redis的setbit怎么批量設置呢?如果要一個ip設置一次的話,需要設置3億次,這個比較難實現(xiàn)。。

    轉(zhuǎn)載于:https://www.cnblogs.com/zhidan/p/7562775.html

    總結(jié)

    以上是生活随笔為你收集整理的判断一个IP是否归属于中国的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。