对于我的服务器应用程序,我需要检查我的黑名单中是否有IP地址.
比较IP地址的最有效方法是什么?将IP地址转换为整数并比较它们是否有效?
取决于您正在使用的语言,但IP地址通常存储为32位无符号整数,至少在网络层存储,使得比较速度非常快.即使不是这样,除非您正在设计高性能分组交换应用程序,否则它不太可能成为性能瓶颈.避免过早优化 - 设计程序的可测试性和可伸缩性,如果遇到性能问题,可以使用分析器查看瓶颈所在.
编辑:澄清一下,IPv4地址存储为32位整数,加上网络掩码(IP地址比较不需要).如果您使用的是较新且当前更为罕见的IPv6,则地址长度为128位.
32位整数是要走的路 - 直到你开始处理128位IPv6地址.
static public bool IsEqual(string ToCompare, string CompareAgainst) { return IPAddressToLongBackwards(ToCompare)==IPAddressToLongBackwards(CompareAgainst); } static private uint IPAddressToLongBackwards(string IPAddr) { System.Net.IPAddress oIP=System.Net.IPAddress.Parse(IPAddr); byte[] byteIP=oIP.GetAddressBytes(); uint ip=(uint)byteIP[0]<<24; ip+=(uint)byteIP[1]<<16; ip+=(uint)byteIP[2]<<8; ip+=(uint)byteIP[3]; return ip; }
如果我理解正确,这是比较两个IP地址的代码.你想要这个吗?你可以进一步做这样的事情:
static public bool IsGreater(string ToCompare, string CompareAgainst) { return IPAddressToLongBackwards(ToCompare)> IPAddressToLongBackwards(CompareAgainst); }
因为你得到了地址字节.
你的意思是你应该把它作为文本字符串比较或将int转换为int并比较为int?
这通常不是这种查找的瓶颈.你可以尝试实现这两种方法,看看哪一种运行得更快.
IP地址查找的真正问题通常是进行有效的查询,利用您处理IP地址而不仅仅是随机数的事实.要做到这一点,你可以查找LC特里,也许这篇文章
显然,只有当你的黑名单拥有数万或数百万条目时,这才会引起你的兴趣.如果它只有10-20个条目,则应首选线性搜索,实际上更有趣的问题是文本比较与整数比较.