如何查找特定IP地址

存储和查询指定范围的IP地址

一、将IP地址转化为数字

1.使用MySQL内置函数

https://www.bennadel.com/blog/1833-converting-an-ip-address-to-an-integer-using-mysql-thanks-julian-halliwell.htm

我试着使用位移位将IP地址值转换为整数。MySQL有执行这些转换的内置函数。我以前从来没有听说过这些活动,所以我想我可以玩一玩。在下面的演示中,我将一个IP地址字符串拖到MySQL引擎中,然后使用iNet_Aton()和iNet_NTOA()两种方法将IP地址转换为一个数字,然后再返回到一个IP地址。

2.计算转换

简要转换思路是:一个IP地址32bit,一共有四部分,每部分都是一个十进制的整数。首先将每部分转换成二进制,然后再对每部分移位,最终将每部分的移位结果相加,得到一个长整型的整数。

在IP到Integer转换中,我们希望获取一个IP地址字符串值,如“70.112.108.147”,并将其转换为整数值,例如1181772947。通常,这是为了存储和比较的目的–我听说存储和比较两个整数值比两个字符串值更容易,速度也更快。不过,撇开数据库哲学不说,这种价值转换是以一种稍微明智的方式进行的.

在我们进入代码之前,让我们考虑一下需要做些什么。IP地址的每个部分(八进制)由一个数值介于0-255之间的单个数字组成。此外,每个十进制数(通常)可以用二进制表示为一个位串。当我们组合一个IP地址的各个部分时,我们必须形成一个单一的整数值;但是,我们必须这样做,即没有任何底层位重叠。
如何查找特定IP地址

二、存入各IP地址对应的IP数字

二分查找:
给定有序区间:[2,5] [8,9] [9,16] [19,25] (代表各类IP分组)

因为区间对放入数组,因此,数组的长度肯定是个偶数。因此,当数组中有重复的元素时,二分查找重复元素时,若查找命中,返回的下标是 “数组下标小的那个”。比如查找元素9,查找命中,返回的index=3。

将之放入数组,得到:[2,5,8,9,9,16,19,25]

假设查找2:

二分查找命中,返回元素2的数组下标 index=0,0是偶数,说明:元素2在区间(index,index+1)区间上,即区间[2,5]

假设查找9:

二分查找命中,返回元素9的数组下标index=3,3是奇数,说明:元素9在区间(index-1,index)上,即区间[8,9],当然了,对于这种特殊的情形,视具体的需求处理。

假设查找10:

二分查找不命中,返回 index=-6,(-6+1)*-1=5,说明元素10可插入在数组下标为5的位置处。由于5是个奇数,因此,元素10在区间(4,5)上,即区间[9,16]

假设查找18:

二分查找不命中,返回index=-7,(-7+1)*(-1)=6,说明元素18可插入在数组下标为6的位置处。由于6是个偶数,因此,元素18不在任何一个区间。

。。。。

总之,结合数组长度永远是偶数(区间对),再结合二分查找返回的“数组下标”是否为奇偶,是否命中,是可以实现:给定一个数,快速地判断这个数是否落在某个区间?若落在了某个区间,则具体是哪个区间上的。

三、存入危险IP地址范围

1.计算危险IP地址转换成的IP数字,得到一个区间;
2.检查IP地址是否在危险区间中