判断一个IP是否归属于中国
业务的要求
- 判断一个IP是不是属于中国的
- 时间复杂度尽量小,适用于请求量大的业务场景
- 不要请求第三方接口,防止出现网络异常
由于只需要判断到国家的纬度,所以不需要用到纯真IP库这样庞大的IP库,通过网上的查询,发现有个中国IP段的列表
http://ipblock.chacuo.net/down/t_txt=c_CN
可以看到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) {$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是否归属于中国相关推荐
- 判断一个IP区间(或IP)是否被另一个IP区间所包含
以下方法实现判断一个IP是否被一个IP区间所包含 有一些静态方法可能引用了同名空间的自定义的类, 至于合并两个相临的IP段,可对其中的最大或最小IP+1 using System; using Sys ...
- 怎么判断私网地址_如何判断一个IP地址是私有地址
如何判断一个IP地址是私有地址,首先,我们得先了解什么是私有地址.本文所指的IP地址,皆是IPV4. 一个IPV4地址,由四段组成,最大值为255,一个IP地址其实就是一个32位的bit串,每8位一段 ...
- 如果精确判断一个IP是否被占用
如果精确判断一个IP是否被占用 我们在局域网经常需要去测试一个IP是否在用,通过使用ping命令去测试网络通还是不通,但这种方法不是很精确. 我在cnaaa.com上购买了云服务器. 原因是 ping ...
- 判断一个IP是否属于中国地区
在 Express.js 中,可以使用 `req.ip` 获取用户的 IP 地址.通常情况下,这个属性会返回当前请求的客户端的 IP 地址.但需要注意的是,在一些特殊情况下(如使用了代理服务器),`r ...
- 可作为计算机主机的IP地址,怎么样判断一个ip是否可以作为主机ip地址
两个IP在同一个子网,是指在相同的网段,主要是看看他们的网络标识是否一样. 接下来我们举例说明,如何去判断A和B两个IP是否在同一网段. A IP:202.194.128.9 B IP:202.194 ...
- 判断一个地图坐标是否在中国镜内
以下语言为js,所取的坐标以百度地图为准,所以需引用百度api,其它的坐标请转换后在判断即可. 1:创建中国地图边界线数组 function CreateChinaMapLine() {var pts ...
- 通过ICMP协议判断一个IP是否可达
在我们开发过程中,会遇到这样一种情况:在我们请求服务器时,服务器会返回两个或者多个ip给我们,让我们自主选择连接,但我们要选择一个和我们匹配的ip连接,比如我们在内网,那么对应的ip就需要我们能pin ...
- 判断一个IP是否CN2线路的最简单方法
境外服务器连接中国,目前最快的线路就是CN2.中国电信CN2线路是新一代承载网,其技术构造远远领先于电信原有163骨干网络,采用极为先进的QOS保证网络的畅通性,能够同时满足语音.视频.数据.专线.国 ...
- python判断ip地址是否合法_python实现判断一个字符串是否是合法IP地址的示例
一个刚结束的笔试题目,简单贴一下吧,下面是具体实现: #!usr/bin/env python #encoding:utf-8 ''' __Author__:沂水寒城 功能:判断一个字符串是否是合法I ...
最新文章
- Android项目出现main.xml编译出错和 出现main.out.xml无法编译的解决办法
- java方面的文献综述怎么写_文献综述应该怎么写?
- java 修饰符作用_Java关键字修饰符的作用范围
- Java程序员在中年危机的时候,如何避免被“优化”掉呢?
- http的请求方法 GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIONS、TRACE 说明
- python哪个版本支持xp_windows支持哪个版本的python
- 7-4 sdut-求两个整数之和(II)
- struts2中action手动获取參数
- ODB for mysql
- C语言中圆的周长怎么算,圆的周长公式 周长怎么算出来的
- 音乐鉴赏 周海宏 网络课程 题库(Ctrl+f查找)点赞哦
- 人工智能教学中的功利文化视野
- MySQL8.0中消失又回来的磁盘临时表
- 【音视频】iOS AVAudioSession梳理
- 【077】Flight Aware-实时航班和机场状态更新
- java基础知识整理
- 自己总结关于浏览器证书安全的二点小技巧
- Attention机制【图像】
- 数字图像处理100问—43 Canny 边缘检测:第三步——滞后阈值
- 解救西西弗斯- 模型驱动架构
热门文章
- 1032 挖掘机技术哪家强 (20 分)(c语言)
- python面向对象(2)—— 继承(3)
- sql2016是否支持linux,微软 SQL Server 支持 Linux 了,2017年 中将正式推出
- #1403 : 后缀数组一·重复旋律 (可重叠最长重复K次子串问题)
- linux文件系统体系结构 和 虚拟文件系统(VFS)
- 【Linux】 Linux 系统文件相关的操作命令
- ResNeXt 之 输入数据预处理代码详解
- 比赛结果预测_决策树_随机森林(通用 数据挖掘入门与实践-实验5)
- 关于Renderscript的理解
- mysql 百度地图插件_GitHub - huizhong/grafana-baidumap-panel: Grafana 百度地图插件