scala – 最佳IP子网匹配
发布时间:2020-12-16 10:01:58 所属栏目:安全 来源:网络整理
导读:以下代码似乎是我程序中最热门的地方. JAVA_OPTS = -Xprof输出: Compiled + native Method 5.7% 173 + 0 scala.collection.IndexedSeqOptimized$class.slice 5.1% 156 + 0 scala.collection.IndexedSeqOptimized$class.foreach 2.9% 87 + 0 java.util.regex
以下代码似乎是我程序中最热门的地方.
JAVA_OPTS = -Xprof输出: Compiled + native Method 5.7% 173 + 0 scala.collection.IndexedSeqOptimized$class.slice 5.1% 156 + 0 scala.collection.IndexedSeqOptimized$class.foreach 2.9% 87 + 0 java.util.regex.Pattern$BmpCharProperty.match 2.5% 76 + 0 scala.collection.IndexedSeqOptimized$class.sameElements 2.4% 73 + 0 trafacct.SubNet.contains Slice,sameElements甚至foreach调用似乎也是最常用的.有人可以就如何优化contains()方法提出建议吗?也许一些技术允许字节分析而不将它们转换为整数?还是没有切片的实体全序列方法? 功能SubNet.contains()将IP地址与子网匹配. object SubNet { def toInts(bytes: Seq[Byte]): Seq[Int] = bytes.map(_.toInt & 0xFF) } case class SubNet(ip:InetAddress,maskLength:Int) extends HostCategory { import SubNet.toInts private val bytes: Int = maskLength / 8 private val subnet = toInts(ip.getAddress) private val bits = bytes * 8 - maskLength def contains(host: Host) = { if (host.ip == null && ip == null) { true } else if (this.ip == null) { false } else { val address = toInts(host.ip.getAddress) if (address.length != subnet.length) { false } else { if (address.slice(0,bytes) != subnet.slice(0,bytes)) { false } else { ((address(bytes) >> (8-bits) ^ subnet(bytes) >> (8-bits)) & 0xFF) == 0 } } } } } 我明白,这种优化不会给我更好的吞吐量,我只是觉得我在这个简单的函数中花了这么多时间做错了. 这段代码应该与IPv6(16字节)兼容,我不喜欢分别处理IPv4案例的想法. 解决方法
你本身没有做错任何事;你只是使用易于使用的集合,而不是处理原语时的性能.
如果你想加快速度,你可以通过切换到使用数组和while循环来获得最大的提升.我不完全清楚你写的代码甚至适用于IPv6,除了以IPv6格式存储的IPv4地址,因为你的子网可能超过256个.此外,通过测试长度,您假设没有相同地址的混合IPv6 / IPv4表示. 我忘了整个“toInts”的东西,只是存储字节数组;然后做一些事情(警告,未经测试) def contains(host: Host): Boolean = { //... if (address.length != subnet.length) false else { var i = 0 while (i<address.length-1) { if (address(i) != subnet(i)) return false i += 1 } (address(i)&0xFF) >> (8-bits) ^ (subnet(i)&0xFF) >> (8-bits) == 0 } } 它实际上并不比原始解决方案复杂,并且运行速度要快10倍. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |