Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 快速比较IP地址的最佳方法_Android_Algorithm_Ip Address - Fatal编程技术网

Android 快速比较IP地址的最佳方法

Android 快速比较IP地址的最佳方法,android,algorithm,ip-address,Android,Algorithm,Ip Address,我正在解析两个包含IP地址的CSV文件。 第一个是源CSV,第二个是“黑名单” 由于源文件的大小,我试图优化查找与黑名单匹配的IP地址的速度 编辑:黑名单由IP地址“块”组成。这意味着黑名单中的每条记录都有两个IP地址:一个Start块(例如216.254.128.0)和一个End块。(Ex.216.254.223.255) 这意味着直接查找等将不起作用 我想知道最好的方法是什么。蛮力法是: String[] parts = sourceIP.split("\\."); // String ar

我正在解析两个包含IP地址的CSV文件。 第一个是源CSV,第二个是“黑名单”

由于源文件的大小,我试图优化查找与黑名单匹配的IP地址的速度

编辑:黑名单由IP地址“块”组成。这意味着黑名单中的每条记录都有两个IP地址:一个
Start
块(例如216.254.128.0)和一个
End
块。(Ex.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块的“高”部分。这是每个记录80多个迭代

我希望在这里得到一些信息,看看比较IP地址的最佳方法

你的想法是什么

是否可以通过序列化
INetAddress
,使用快速位掩码快速比较值

文件结构澄清:

源IP文件:

包含数据库中记录的列表。(约4k)。每个记录包含名称、地址、电子邮件和IP地址

黑名单:

包含4.2k条记录。每个记录都是一个IP地址“块”。这包括两个IP地址。1.开始和2。结束


如果源列表中的记录有一个在黑名单中找到的IP地址,我需要保存该记录并将其添加到一个新文件。

将两个文件放在一个字符串中。使用split(“,”)拆分第一个字符串中的ip。循环通过获得的ips阵列。对于每个ip,在第二个字符串中搜索它,如
黑名单.indexOf(“,“+ip+”,”)
,但首先在黑名单字符串的开头和结尾添加一个“,”。

将两个文件放在一个字符串中。使用split(“,”)拆分第一个字符串中的ip。循环通过获得的ips阵列。对于每个ip,在第二个字符串中搜索它,如
黑名单.indexOf(“,“+ip+”,”)
,但首先在黑名单字符串的开头和结尾添加一个“,”。

强制执行。 将所有内容加载到ram中,没有理由不加载。 将IP拆分为二维阵列。 {0:123,123,123,123} 将黑名单转换为3d阵列。 现在可以开始搜索整数了。 当你有一个匹配比较下一节。 如果源值更高,则将其与同一段的结束块进行比较。 当有匹配项时,将其推送到一个新数组,并在最后将其写入一个文件。 如果这需要更多的时间来运行,那么我需要键入此内容,然后关闭您打开的色情内容,因为您的ram已满,并且正在使用您的页面文件。

强制执行。 将所有内容加载到ram中,没有理由不加载。 将IP拆分为二维阵列。 {0:123,123,123,123} 将黑名单转换为3d阵列。 现在可以开始搜索整数了。 当你有一个匹配比较下一节。 如果源值更高,则将其与同一段的结束块进行比较。 当有匹配项时,将其推送到一个新数组,并在最后将其写入一个文件。
如果这需要更多的时间来运行,那么我需要键入它,然后关闭您打开的a片,因为您的ram已满,并且正在使用您的页面文件。

您可以使用名为的数据结构。这在性能和存储方面都非常有效。举个例子,这里有一个问题,有一个答案推荐这个

据我所知,谷歌Chrome也使用了这项技术,正如Matthials Vallentine的博客文章中很好地解释的那样

然而,更多简洁的解释可以在网站上找到。一些摘录

最初的泄漏大约为9.3GB未压缩,其中3.3GB是电子邮件 地址[…]这意味着数据可以放入512MB(即232位) 并允许我们在恒定时间内执行查找[…]和 允许占用840MB的最佳bloom过滤器 实际上根本没有假阳性


可以使用名为的数据结构。这在性能和存储方面都非常有效。举个例子,这里有一个问题,有一个答案推荐这个

据我所知,谷歌Chrome也使用了这项技术,正如Matthials Vallentine的博客文章中很好地解释的那样

然而,更多简洁的解释可以在网站上找到。一些摘录

最初的泄漏大约为9.3GB未压缩,其中3.3GB是电子邮件 地址[…]这意味着数据可以放入512MB(即232位) 并允许我们在恒定时间内执行查找[…]和 允许占用840MB的最佳bloom过滤器 实际上根本没有假阳性


似乎最直接的解决方案是使用存储黑名单。然后检查IP是否与任何间隔相交

您可能还想考虑使用TIE/HASHIT表来获得间隔相同的快速查找。IE:216.254.128.0到216.254.223.255可以合并到216.254.(128.0223.255),其中()是间隔。因此,您将得到两个哈希表查找(一个用于216,一个用于254),然后在区间树中进行搜索,这可能只包含少量元素


您还可以将重叠的间隔合并为单个间隔,这可能可以在构建间隔树时完成。在这种情况下,它最终更像是一个二叉搜索树。

似乎最直接的解决方案是使用。然后检查IP是否与任何间隔相交

您可能还想考虑使用TIE/HASHIT表来获得间隔相同的快速查找。IE:216.254.128.0至216.254.223.255

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];
class IPRange
{
    public int startIp;
    public int stopIp;
}
start range    end range
192.168.1.1    192.168.2.255
192.168.2.1    192.168.3.255