当前位置:  开发笔记 > 运维 > 正文

你会如何比较IP地址?

如何解决《你会如何比较IP地址?》经验,为你挑选了4个好方法。

对于我的服务器应用程序,我需要检查我的黑名单中是否有IP地址.

比较IP地址的最有效方法是什么?将IP地址转换为整数并比较它们是否有效?



1> sk...:

取决于您正在使用的语言,但IP地址通常存储为32位无符号整数,至少在网络层存储,使得比较速度非常快.即使不是这样,除非您正在设计高性能分组交换应用程序,否则它不太可能成为性能瓶颈.避免过早优化 - 设计程序的可测试性和可伸缩性,如果遇到性能问题,可以使用分析器查看瓶颈所在.

编辑:澄清一下,IPv4地址存储为32位整数,加上网络掩码(IP地址比较不需要).如果您使用的是较新且当前更为罕见的IPv6,则地址长度为128位.



2> Graeme Perro..:

32位整数是要走的路 - 直到你开始处理128位IPv6地址.



3> AZ_..:
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);
  }

因为你得到了地址字节.



4> shoosh..:

你的意思是你应该把它作为文本字符串比较或将int转换为int并比较为int?

这通常不是这种查找的瓶颈.你可以尝试实现这两种方法,看看哪一种运行得更快.

IP地址查找的真正问题通常是进行有效的查询,利用您处理IP地址而不仅仅是随机数的事实.要做到这一点,你可以查找LC特里,也许这篇文章

显然,只有当你的黑名单拥有数万或数百万条目时,这才会引起你的兴趣.如果它只有10-20个条目,则应首选线性搜索,实际上更有趣的问题是文本比较与整数比较.

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有