首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IP地址的快速文件搜索算法

IP地址的快速文件搜索算法
EN

Stack Overflow用户
提问于 2010-04-18 00:05:07
回答 4查看 1.3K关注 0票数 4

问题

如何最快地找到一个IP地址是否存在于包含如下IP地址的文件中:

219.93.88.62 219.94.181.87 219.94.193.96 220.172.201 220.110.162.50 220.126.52.187 220.126.52.247

约束

  • 没有数据库(如MySQL、PostgreSQL、Oracle等)
  • 允许不频繁的预处理(请参阅可能性部分)。
  • 最好不用加载每个查询(131 to )的文件。
  • 使用5兆以下的磁盘空间
  • 没有额外的PHP模块

文件详细信息

  • 每行一个IP地址
  • 9500+线

可能的解决方案

  • 创建目录层次结构(根树?)然后使用is_dir() (遗憾的是,这需要87兆字节)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-04-18 00:34:51

逐行扫描文件以查找IP,如果在到达232.0.17.1之前需要检查9,000个非匹配项,则似乎很痛苦。

您的文件是否被限制为单个文件?例如,假设这个列表是被禁止的,你只想看看其中一个是否“在”列表中。

如果您创建了一个包含多个文件的DIR,该怎么办:

代码语言:javascript
运行
复制
BannedIPs
  +- 0.ips
  +- 1.ips
  +- 37.ips
  +- 123.ips
  +- 253.ips
  +- 254.ips

每个文件只包含以该编号开头的IP地址。

如果你够幸运的话,能有均匀的分布。您将有256个文件,但每个文件只有37个条目。

因此,当您想要测试:232.0.17.1时,您可以查看232.ips文件并对其进行扫描。

票数 3
EN

Stack Overflow用户

发布于 2010-04-18 00:08:46

由于您的文件已经按排序顺序存储IP地址,所以可以使用二进制搜索在O(log(n))时间内快速找到特定的IP地址。

如果您想进一步加快速度,您可以缓存内存中的每100行,并首先使用内存中的二进制搜索,然后您知道需要读取的文件的哪一部分才能完成搜索。

话虽如此,131 to实际上并不多,所以最简单和最快的解决方案是购买更多的内存,并将整个文件缓存在哈希表中。

票数 3
EN

Stack Overflow用户

发布于 2010-04-18 00:16:13

编辑--我没有注意到php标记,我不知道在该语言中是否可以使用以下类型的东西。但无论如何我还是会把它留给这个想法的。

IPv4地址可以表示为32位数字,所以我只需创建一个int32数组,用下面的Python psuedocode将您的地址转换为‘into’:

代码语言:javascript
运行
复制
x = 0
i = 24
s = '111.222.333.444'
for part in s.split('.'):
    x += part.toint() << i
    i -= 8
IPlist.append(x)

然后,您可以获得输入地址,以同样的方式将其转换为int,并对数组进行二进制搜索。

对于10k线,阵列需要40 kBytes。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2660562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档