快速子网内检查IP地址字符串(适用于IPv4和IPv6)

时间:2018-04-11 12:03:58

标签: java ip ipv6 ipv4

我想对IP地址字符串进行快速的子网内检查。将字符串转换为整数将是一项代价高昂的操作,并且希望尽可能快地获得代码。 a库不提供IPv6子网内检查,IPv4版本相当慢。

考虑以下输入: SubnetUtils

这应该导致 IP: aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa Subnet: aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa/128 ,因为IP地址包含在子网中。

在Java中为IPv4和IPv6执行此计算的最快方法是什么?

我将包含并更新以下建议解决方案的基准测试结果:

true

1 个答案:

答案 0 :(得分:0)

我已经尝试使用open-source IPAddress Java library进行基准测试,以与上述其他基准(CIDRUtils,SubnetUtils和Ineter)进行比较。免责声明:我是IPAddress库的项目经理。您还可以参考“使用CIDRUtils和对IPv6使用Ineter的按字符进行优化的比较”,但我无权访问该代码。

IPAddress的代码比其他代码更简单。与其他代码不同,IPv4和IPv6的代码相同,只是一行:

 boolean result = new IPAddressString(ipRange).prefixEquals(new IPAddressString(ip));

请随意尝试。

您的测试是:

  • 测试1和2:具有/ 24子网的IPv4和IPV6范围(使用CIDR)(50%在范围内,50%不在范围内)
  • 测试3和4:IPv4和IPv6范围(使用CIDR),它是IPv6的/ 128子网和IPv4的/ 32子网(50%在范围内,50%不在范围内)

根据Macbook Pro笔记本电脑上基准测试的10次单独运行,结果显示:

    在所有测试中,
  • IPAddress比CIDRUtils和SubnetUtils更快(从25%到70%更快)。 IPAddress和Ineter的性能不相上下
  • IP地址和Ineter比较
    • 测试1:IPAddress速度提高了3%,大​​约470毫秒
    • 测试2:Ineter速度提高7%,大​​约520毫秒
    • 测试3:IPAddress速度提高32%,大​​约278毫秒
    • 测试4:Ineter速度提高3%,大​​约453毫秒

当然,在其他机器上,里程可能会有所不同。但是,根据我的测量,似乎Ineter在使用IPv6时速度稍快,但是在IPv4 / 24子网中速度稍慢,而在完整的/ 32 IPv4子网中速度慢得多。但是,IPAddress稍有不同,因为IPv4和IPv6的代码相同,而Ineter则需要特定于IPv4或IPv6的代码。