- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在解析两个包含 IP 地址的 CSV 文件。第一个是源 CSV,第二个是“黑名单”。
由于源文件的大小,我正在尝试优化查找与黑名单匹配的 IP 地址的速度。
编辑: 黑名单由 IP 地址“ block ”组成。这意味着黑名单中的每条记录都有两个 IP 地址:一个 Start
block (例如 216.254.128.0)和一个 End
block 。 (例如 216.254.223.255)
这意味着直接查找等将不起作用。
我想知道解决这个问题的最佳方法是什么。蛮力方法是:
String[] parts = sourceIP.split("\\."); // String array, each element is text between dots
int hi = 255;
int lo = 0;
int mid = (hi - lo) / 2 ;
if (Integer.valueOf(parts[0]) > mid) {
mid = lo;
}
然后我可以对每个 部分
重复此操作以确定 IP 地址是否在黑名单中。
这看起来非常激进,并且有 4k+ 记录,这可能需要非常非常长的时间。
决定每个部分可能需要 10 次以上的迭代,然后必须重复此过程以检查黑名单中 IP block 的“高”部分。这是每条记录 80 多次迭代。
我希望在这里得到一些输入,以了解比较 IP 地址的最佳方法。
你有什么想法?
是否可以通过序列化 INetAddress
使用快速按位掩码来快速比较值?
文件结构说明:
源IP文件:
包含来自数据库的记录列表。 (约 4k)。每条记录都包含姓名、地址、电子邮件和 IP 地址。
黑名单:
包含 4.2k 条记录。每条记录都是一个 IP 地址“ block ”。这由两个 IP 地址组成。 1. 开始和 2. 结束。
如果源列表中的记录有在黑名单中找到的 IP 地址,我需要保存该记录并将其添加到新文件中。
最佳答案
我假设您说的是 xxx.xxx.xxx.xxx 形式的 IPV4 地址。
您可以轻松地将 IP 地址转换为整数。每个段(即 xxx)为 8 位(即一个字节)。所以它们中的四个加起来就是一个 32 位整数。因此,给定一个像“192.168.100.12”这样的 IP 地址,您可以将它分成四个部分,将每个部分解析为一个字节并创建一个整数。比方说,您创建了一个字节数组的段:
ipBytes[0] = 192;
ipBytes[1] = 168;
ipBytes[2] = 100;
ipBytes[3] = 12;
你可以把它变成一个整数:
int ipAddress = ipBytes[0];
ipAddress = (ipAddress << 8) | ipBytes[1];
ipAddress = (ipAddress << 8) | ipBytes[2];
ipAddress = (ipAddress << 8) | ipBytes[3];
有更有效的方法可以做到这一点,但您明白了。您的语言的运行时库可能已经有一些东西可以解析 IP 地址并为您提供字节以使其成为整数。
您有一组 IP 地址范围,您希望根据这些范围检查您的源地址。将每个范围加载到这样的结构中:
class IPRange
{
public int startIp;
public int stopIp;
}
并将它们存储在数组或列表中。然后按起始 IP 地址对列表进行排序。
对于每个源 IP 地址,将其转换为整数并对列表进行二进制搜索,搜索起始 IP 地址。可能找不到(可能不会)找到源地址本身,但是当二分查找终止时,mid
值将保存起始 IP 地址小于或等于源地址。然后,您只需根据该项目的结束 IP 地址检查源地址,看看它是否在范围内。
二分查找复杂度为 O(log n)。如果您正在搜索包含 4,300 个范围的列表,则最多需要 13 个探测才能在数组中找到一个地址。这应该足够快了,即使进行 4,000 次不同的搜索也是如此。您只是在谈论范围阵列的总共 50,000 个探针的数量级。
一些注意事项:
首先,正如我上面所说,我假设您在谈论 IPV4 地址。如果您谈论的是 IPV6 地址,相同的概念仍然适用,但您需要一个 64 位整数。我对 IPv6 了解不够,无法说明如何将地址转换为 64 位整数。可能您应该依靠运行时库来获取地址字节。
第二:我假设范围不重叠。也就是说,您不会有类似的东西:
start range end range
192.168.1.1 192.168.2.255
192.168.2.1 192.168.3.255
如果您有,那么 IP 地址可能属于这些范围中的任何一个。您可能会构建重叠范围,从而使地址从裂缝中掉下来。如果范围重叠,问题就会变得有点复杂。
关于android - 快速比较 IP 地址的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24478774/
给定的输入是192.168.3.78/27 输入可以是任意C类ip地址,以上ip为例进行尝试 预期输出应显示从 192.168.3.65 到 192.168.3.94 的所有 IP如下 192.168
您好,我是一名 javascript 菜鸟,正在为 IP 范围编写验证器。例如,1.1.1.1-2.2.2.2 是一个有效范围,但我想确保第一个 IP 不大于第二个 IP。 2.2.2.2-1.1.1
在 MySQL 数据库中存储多种 IP 类型的最佳方式是什么: - 单一 IP (123.123.123.123) - IP 范围 (123.123.123.1 - 123.123.123.121)
所以我有一个带有子网的 IP:8.8.8.0/24 我如何将其转换为 8.8.8.0 和 8.8.8.255(实际上是它们的 ip2long 结果) 在 PHP 和 JavaScript 中 最佳答案
我有 Windows7 作为我的基本操作系统。最重要的是,我在 Ubuntu 上安装了 Virtual Box。我希望 ubuntu 获得与我的基本操作系统(Win7)相同的 IP 地址。我如何实现这
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
阅读后List of IP Space used by Facebook : “真实”列表是最后一个答案,但我想知道 Igy(答案标记为解决方案)如何通过将连续的类添加到更大的类中来大幅缩小列表(通过
我正在开发一个 web 应用程序,我已经在我的本地主机中创建了这个项目,但是网络用户需要访问我的项目,我不想给他们一个不友好的 ip 地址,所以我想用户访问一个名称例子 http://myprojec
有人可以向我解释 Azure 在逻辑应用程序的出站 IP 地址之间不同的新方式之间的区别。 我认为文档在对该问题的正确解释方面非常精简。读起来听起来好像 IP 地址在逻辑应用程序中具有完全相同的作用。
我正在尝试熟悉一个项目中java中的数据报系统,目前,我们只使用UDP包。 为了发送消息,我们在 DatagramPacket 上设置目标 IP。 /* * The fields o
我有一个 Java 服务器,当我获得连接时,我需要检查 IP 是本地 IP 还是公共(public) IP。当它是我自己的本地 IP 时,我可以检测到它,但我在使用其他本地 IP 时遇到了一些问题。J
所以我在网上看到了很多例子,这些例子展示了如果你知道起始 IP 和结束 IP 如何获得完整的 IP,但我需要的是在提供后告诉我完整的 IP 范围带有起始 IP 和所需 IP 地址数的代码。 因此,例如
我创建了一个 python 项目,用于扫描 IP 范围(即 x.y.z.0/24)并返回在线主机列表。它将在线主机列表保存到仅包含 IP 的文件中(即 ['192.168.0.1'、'192.168.
如果用户的 ip 在某个 IP 范围之间,我正在使用重定向。但是,我正在使用多个 ip 范围,所以我想知道执行此操作的最佳方法。我目前正在使用它来重定向, 但是如果 IP 范围是 72.122.166
好的,现在是星期五下午,我度过了漫长的一周,希望能得到一些帮助!目前,我有一个 IP 范围列表,如下所示: List ipRanges = new List(); ipRanges.Add(new I
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
下面是我的 CloudFormation 模板的片段,用于将弹性 IP 地址与网络接口(interface)的主 IP 相关联: "MyInterfaceSelfEipAssociat
我在 Azure 上创建了 Python 函数,该函数调用外部 API 服务,该服务仅允许访问白名单 IP。 根据 Microsoft 文档 ( https://learn.microsoft.com
我在 Azure 上创建了 Python 函数,该函数调用外部 API 服务,该服务仅允许访问白名单 IP。 根据 Microsoft 文档 ( https://learn.microsoft.com
我在我的 CentOS 5 x86_64 中使用 IP 别名。为简化此示例:IP 地址 A 是 eth0 地址,IP 地址 B 是 eth0:0地址。我有 2 个 Apache 实例(版本 2.2.3
我是一名优秀的程序员,十分优秀!