讲师中心 微信公众号
AI工具推荐 视频效率加速

高效判断端口范围集合是否相交:三种算法对比与推荐实现

千杰同学_7712

千杰同学_7712

发布时间:2026-01-31 14:57:10

|

452人浏览过

|

来源于php中文网

原创

高效判断端口范围集合是否相交:三种算法对比与推荐实现

本文对比分析了三种判断防火墙访问控制列表(acl)端口范围与目标端口范围是否存在交集的算法,重点评估其时间/空间复杂度与工程适用性,最终推荐基于有序区间二分查找的方案,并提供可直接使用的 java 实现。

在网络安全运维与自动化策略分析中,常需快速判定一组目标端口(如 {"5672", "15672-15674"})是否与防火墙 ACL 中定义的服务端口范围(如 {"20-22", "443", "8080-8088", "10000-65535"})存在交集。由于端口范围可能覆盖 1–65535 的整数空间,暴力展开为单点集合(Approach 1)虽编码简单,但内存与时间开销不可接受(最坏 O(65535) 级别)。因此,必须采用基于区间表示与高效区间重叠检测的算法。

✅ 推荐方案:有序区间 + 二分查找(Approach 2)

该方案将 ACL 端口统一归一化为 [start, end] 区间(如 "443" → [443, 443],"20-22" → [20, 22]),构建按 start 排序的不可变区间列表;对每个待查目标区间 [tStart, tEnd],通过二分查找定位所有可能重叠的候选 ACL 区间(即满足 acl[i].end >= tStart && acl[i].start

其核心优势在于:

Java注释规范Skills
Java注释规范Skills

当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。

下载
  • 时间复杂度优:预处理 ACL 区间排序仅需 O(n log n);每次查询 m 个目标区间仅需 O(m log n);
  • 空间极省:仅存储 n 个区间(通常 n ≪ 65535),内存占用恒定;
  • 工程友好:逻辑清晰、易于测试、支持复用(ACL 列表构建一次,多次查询)。

以下是完整 Java 实现(含解析、标准化与交集检测):

import java.util.*;

public class PortRangeIntersector {
    // 内部区间类(不可变)
    public static final class Range implements Comparable<Range> {
        final int start, end;
        Range(int s, int e) {
            this.start = Math.min(s, e);
            this.end = Math.max(s, e);
        }
        @Override
        public int compareTo(Range o) { return Integer.compare(this.start, o.start); }
        // 检查 [this.start, this.end] 与 [otherStart, otherEnd] 是否有交集
        boolean intersects(int otherStart, int otherEnd) {
            return this.start <= otherEnd && otherStart <= this.end;
        }
    }

    // 解析字符串端口(支持 "80" 或 "1000-2000")
    public static Range parsePort(String portStr) {
        if (portStr == null || portStr.trim().isEmpty())
            throw new IllegalArgumentException("Invalid port string: " + portStr);
        String[] parts = portStr.trim().split("-", 2);
        int start = Integer.parseInt(parts[0]);
        int end = parts.length == 2 ? Integer.parseInt(parts[1]) : start;
        return new Range(start, end);
    }

    // 构建已排序的 ACL 区间列表(建议缓存复用)
    public static List<Range> buildSortedAclRanges(String[] aclPorts) {
        List<Range> ranges = new ArrayList<>();
        for (String p : aclPorts) {
            ranges.add(parsePort(p));
        }
        ranges.sort(Comparator.naturalOrder());
        return Collections.unmodifiableList(ranges);
    }

    // 判断目标端口集合(字符串数组)是否与 ACL 存在任意交集
    public static boolean hasIntersection(List<Range> sortedAcl, String[] targetPorts) {
        for (String t : targetPorts) {
            Range target = parsePort(t);
            // 二分查找:首个 start <= target.end 的区间(右边界约束)
            int lo = 0, hi = sortedAcl.size();
            while (lo < hi) {
                int mid = lo + (hi - lo) / 2;
                if (sortedAcl.get(mid).start <= target.end) lo = mid + 1;
                else hi = mid;
            }
            // 检查 [0, lo) 范围内所有可能重叠的区间(因 start ≤ target.end 是必要条件)
            for (int i = 0; i < lo && i < sortedAcl.size(); i++) {
                if (sortedAcl.get(i).intersects(target.start, target.end)) {
                    return true;
                }
            }
        }
        return false;
    }

    // 使用示例
    public static void main(String[] args) {
        String[] acl = {"20-22", "443", "8080-8088", "10000-65535"};
        String[] targets1 = {"5672", "15672-15674"}; // 无交集 → false
        String[] targets2 = {"21", "443-444"};       // 有交集 → true

        List<Range> aclRanges = buildSortedAclRanges(acl);
        System.out.println(hasIntersection(aclRanges, targets1)); // false
        System.out.println(hasIntersection(aclRanges, targets2)); // true
    }
}

⚠️ 注意事项与优化建议

  • 输入校验:生产环境需增强 parsePort 对非法格式(如负数、非数字、end
  • 性能再优化:若 ACL 规则极多(n > 10⁴)且查询高频,可改用 TreeSet 替代 ArrayList,利用 headSet() / tailSet() 快速截取候选区间;
  • 扩展性:本方案天然支持 IPv4/IPv6 地址段、时间窗口等任意一维连续区间交集检测,只需替换 Range 的类型与比较逻辑;
  • 避免误区:不要试图用位运算(如 bitmap)压缩端口——65536 位虽仅 8KB,但动态范围合并、区间查询仍需遍历,且丧失语义清晰性。

综上,Approach 2 是平衡开发效率、运行性能与长期可维护性的最优解。它摒弃了“以空间换时间”的粗暴思路,转而利用区间数学性质与经典搜索算法,在真实防火墙策略分析场景中兼具鲁棒性与可扩展性。

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

6316

2023.08.14

Java 网络安全
Java 网络安全

本专题聚焦 Java 在网络安全与加密通信中的应用,系统讲解常见加密算法(MD5、SHA、AES、RSA)、数字签名、HTTPS证书配置、令牌认证(JWT、OAuth2)及常见安全漏洞防护(XSS、SQL注入、CSRF)。通过实战项目(如安全登录系统、加密文件传输工具),帮助学习者掌握 Java 安全开发与加密技术的实战能力。

5025

2025.10.13

PHP 安全与防护
PHP 安全与防护

本专题聚焦于PHP开发中的安全问题与防御措施,详细讲解SQL注入、XSS攻击、CSRF攻击、文件包含漏洞等常见安全风险及其修复方法。通过结合实际案例,帮助开发者理解漏洞成因,掌握输入验证、会话安全、加密存储与安全编码规范,全面提升PHP网站的安全防护水平。

435

2025.11.04

PHP 命令行脚本与自动化任务开发
PHP 命令行脚本与自动化任务开发

本专题系统讲解 PHP 在命令行环境(CLI)下的开发与应用,内容涵盖 PHP CLI 基础、参数解析、文件与目录操作、日志输出、异常处理,以及与 Linux 定时任务(Cron)的结合使用。通过实战示例,帮助开发者掌握使用 PHP 构建 自动化脚本、批处理工具与后台任务程序 的能力。

506

2025.12.13

Figma AI自动化智能数据填充与交互生成实战
Figma AI自动化智能数据填充与交互生成实战

告别机械重复,详细演示如何用 AI 填充业务真实数据,并自动为页面添加交互连线,将静态设计稿快速转变为动态原型。

325

2026.05.13

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

120

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

60

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

60

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

40

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn