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

标签 php algorithm ip-address text-search

问题

查找 IP 地址是否存在于包含排序为 IP 地址的文件中的最快方法是什么:

219.93.88.62
219.94.181.87
219.94.193.96
220.1.72.201
220.110.162.50
220.126.52.187
220.126.52.247

约束

  • 没有数据库(例如 MySQL、PostgreSQL、Oracle 等)
  • 允许不频繁的预处理(参见可能性部分)
  • 最好不要每次查询都加载文件 (131Kb)
  • 使用不到 5 兆字节的磁盘空间
  • 没有额外的 PHP 模块

文件详细信息

  • 每行一个 IP 地址
  • 9500 多行

可能的解决方案

  • 创建目录层次结构 ( radix tree ?) 然后使用 is_dir()(遗憾的是,这使用了 87 兆字节)

最佳答案

如果在到达 232.0.17.1

之前要检查 9,000 个不匹配项,逐行扫描文件以查找 IP 似乎很痛苦

您的文件是否仅限于单个文件?例如假设此列表是被禁止的 IP,而您只想查看是否有一个“在”列表中。

如果您创建一个包含多个文件的 DIR 会怎样:

BannedIPs
  +- 0.ips
  +- 1.ips
  +- 37.ips
  +- 123.ips
  +- 253.ips
  +- 254.ips

每个文件仅包含以该数字开头的 IP 地址。

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

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

关于php - IP地址的快速文件搜索算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2660562/

相关文章:

php - 优化我的日志报告查询

javascript - 无法操作 $.post 中的数据

php - 需要帮助简化我的 php 表

将数字映射到十六进制颜色的算法

c++ - 寻路算法创建循环

python - 在 Python 中判断 Host 是域名还是 IP

php - Laravel 根据距离对用户集合进行排序

algorithm - 使用附加数据结构的线性排序(查找集合中值的时间复杂度为 O(1),添加元素的时间复杂度为 O(1))

ruby - 如何在 ruby​​ 中获取 ip 地址、referer 和用户代理?

android - 在虚拟盒子上获取android的IP地址