业务的要求

  • 判断一个IP是不是属于中国的
  • 时间复杂度尽量小,适用于请求量大的业务场景
  • 不要请求第三方接口,防止出现网络异常

由于只需要判断到国家的纬度,所以不需要用到纯真IP库这样庞大的IP库,通过网上的查询,发现有个中国IP段的列表
http://ipblock.chacuo.net/down/t_txt=c_CN
可以看到IP段有2K个左右,如果用二分查询法,时间复杂度是logN。基本上能够满足需求了。

实现步骤

一、 整理IP段配置

为了方便IP进行比较,这里将IP转换为long格式。

  1. 把数据load进来,取第一第二行,ip2long处理
  2. 第一行保存在left,第二行保存在right中
  3. 然后根据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) {$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地址转为long的最大值刚好是2^32-1 ,那么在redis中我们刚好可以申请一个4294967295的bitmap,占用内存为512M。
如果能够把所有中国的IP对应的long都设置为1,那么每次查询都只要0(1),遇到的问题是redis的setbit怎么批量设置呢?如果要一个ip设置一次的话,需要设置3亿次,这个比较难实现。。

转载于:https://www.cnblogs.com/zhidan/p/7562775.html

判断一个IP是否归属于中国相关推荐

  1. 判断一个IP区间(或IP)是否被另一个IP区间所包含

    以下方法实现判断一个IP是否被一个IP区间所包含 有一些静态方法可能引用了同名空间的自定义的类, 至于合并两个相临的IP段,可对其中的最大或最小IP+1 using System; using Sys ...

  2. 怎么判断私网地址_如何判断一个IP地址是私有地址

    如何判断一个IP地址是私有地址,首先,我们得先了解什么是私有地址.本文所指的IP地址,皆是IPV4. 一个IPV4地址,由四段组成,最大值为255,一个IP地址其实就是一个32位的bit串,每8位一段 ...

  3. 如果精确判断一个IP是否被占用

    如果精确判断一个IP是否被占用 我们在局域网经常需要去测试一个IP是否在用,通过使用ping命令去测试网络通还是不通,但这种方法不是很精确. 我在cnaaa.com上购买了云服务器. 原因是 ping ...

  4. 判断一个IP是否属于中国地区

    在 Express.js 中,可以使用 `req.ip` 获取用户的 IP 地址.通常情况下,这个属性会返回当前请求的客户端的 IP 地址.但需要注意的是,在一些特殊情况下(如使用了代理服务器),`r ...

  5. 可作为计算机主机的IP地址,怎么样判断一个ip是否可以作为主机ip地址

    两个IP在同一个子网,是指在相同的网段,主要是看看他们的网络标识是否一样. 接下来我们举例说明,如何去判断A和B两个IP是否在同一网段. A IP:202.194.128.9 B IP:202.194 ...

  6. 判断一个地图坐标是否在中国镜内

    以下语言为js,所取的坐标以百度地图为准,所以需引用百度api,其它的坐标请转换后在判断即可. 1:创建中国地图边界线数组 function CreateChinaMapLine() {var pts ...

  7. 通过ICMP协议判断一个IP是否可达

    在我们开发过程中,会遇到这样一种情况:在我们请求服务器时,服务器会返回两个或者多个ip给我们,让我们自主选择连接,但我们要选择一个和我们匹配的ip连接,比如我们在内网,那么对应的ip就需要我们能pin ...

  8. 判断一个IP是否CN2线路的最简单方法

    境外服务器连接中国,目前最快的线路就是CN2.中国电信CN2线路是新一代承载网,其技术构造远远领先于电信原有163骨干网络,采用极为先进的QOS保证网络的畅通性,能够同时满足语音.视频.数据.专线.国 ...

  9. python判断ip地址是否合法_python实现判断一个字符串是否是合法IP地址的示例

    一个刚结束的笔试题目,简单贴一下吧,下面是具体实现: #!usr/bin/env python #encoding:utf-8 ''' __Author__:沂水寒城 功能:判断一个字符串是否是合法I ...

最新文章

  1. Android项目出现main.xml编译出错和 出现main.out.xml无法编译的解决办法
  2. java方面的文献综述怎么写_文献综述应该怎么写?
  3. java 修饰符作用_Java关键字修饰符的作用范围
  4. Java程序员在中年危机的时候,如何避免被“优化”掉呢?
  5. http的请求方法 GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIONS、TRACE 说明
  6. python哪个版本支持xp_windows支持哪个版本的python
  7. 7-4 sdut-求两个整数之和(II)
  8. struts2中action手动获取參数
  9. ODB for mysql
  10. C语言中圆的周长怎么算,圆的周长公式 周长怎么算出来的
  11. 音乐鉴赏 周海宏 网络课程 题库(Ctrl+f查找)点赞哦
  12. 人工智能教学中的功利文化视野
  13. MySQL8.0中消失又回来的磁盘临时表
  14. 【音视频】iOS AVAudioSession梳理
  15. 【077】Flight Aware-实时航班和机场状态更新
  16. java基础知识整理
  17. 自己总结关于浏览器证书安全的二点小技巧
  18. Attention机制【图像】
  19. 数字图像处理100问—43 Canny 边缘检测:第三步——滞后阈值
  20. 解救西西弗斯- 模型驱动架构

热门文章

  1. 1032 挖掘机技术哪家强 (20 分)(c语言)
  2. python面向对象(2)—— 继承(3)
  3. sql2016是否支持linux,微软 SQL Server 支持 Linux 了,2017年 中将正式推出
  4. #1403 : 后缀数组一·重复旋律 (可重叠最长重复K次子串问题)
  5. linux文件系统体系结构 和 虚拟文件系统(VFS)
  6. 【Linux】 Linux 系统文件相关的操作命令
  7. ResNeXt 之 输入数据预处理代码详解
  8. 比赛结果预测_决策树_随机森林(通用 数据挖掘入门与实践-实验5)
  9. 关于Renderscript的理解
  10. mysql 百度地图插件_GitHub - huizhong/grafana-baidumap-panel: Grafana 百度地图插件