我需要在我的服务器应用中检查一个IP地址是否在黑名单中。
比较IP地址的最有效方式是什么?将IP地址转换为整数并进行比较会更高效吗?
我需要在我的服务器应用中检查一个IP地址是否在黑名单中。
比较IP地址的最有效方式是什么?将IP地址转换为整数并进行比较会更高效吗?
取决于你使用的编程语言,但通常在网络层,IP地址被存储为32位无符号整数,这样比较非常快。即使不是这样,除非你正在设计高性能的数据包交换应用程序,否则不太可能成为性能瓶颈。避免过早优化——为可测试性和可扩展性设计程序,如果出现性能问题,则可以使用分析器查看瓶颈所在位置。
编辑:澄清一下,IPv4地址被存储为32位整数,加上网络掩码(对于IP地址比较并不必要)。如果你正在使用更新且目前更为罕见的IPv6,则地址将为128位长。
32位整数是首选——直到你开始处理128位的IPv6地址。
你的意思是将其作为文本字符串进行比较还是将int转换为int并作为int进行比较?
通常这种查找中这不是瓶颈。你可以尝试实现两种方法,看哪一种运行更快。
IP地址查找的真正问题通常是进行有效查询,利用您正在处理的IP地址而不仅仅是随机数字的事实。为了实现这一点,您可以查找LC trie。
显然,只有当黑名单拥有数万或数百万条目时,这才会引起您的兴趣。如果它只有10-20个条目,则应优先选择线性搜索,实际上更有趣的问题是文本比较与整数比较。
我发现这是有效的,但会比较冗长,当然你需要将黑名单IP以整数形式索引。
使用像PeerGuardian这样的工具,在驱动程序级别禁止黑名单上的IP地址进行传入TCP/IP连接。高度安全,无需编写代码(可以说:高度安全,因为不需要编写代码)。
基数树或PATRICIA Trie是这方面的最佳结构。
查看flow-tools的C源代码: http://www.splintered.net/sw/flow-tools/
我多年前曾经参与过这个项目。
您是否存在效率方面的问题?
如果是这样,请发布代码(或伪代码),我们可以对其进行分析。
如果没有,我建议尝试一些简单的方法,例如将条目存储在排序列表中,并使用您环境中现有的 Sort()
和 Find()
。
整数比较比字符串比较要快得多。
如果你把整数存储在一个有序列表中,你可以比在无序列表中更快地找到它们。