1. 背景の紹介
一部のシナリオでは、IP セグメントが重複しているかどうかを確認する必要があります。たとえば、IP セグメントの繰り返し構成を避けるために一部のデバイスにフィルタリング ルールを構成するには、IP セグメントが重複しているかどうかを確認する必要があります。
IP セグメントが重複するシナリオがいくつかあります。
1) IP セグメント 1 には IP セグメント 2 が含まれます;
2) IP セグメント 2 には IP セグメント 1 が含まれます;
3) IP セグメント 1 の開始 IP は IP セグメント 2 の終了 IP と同じであるか、IP セグメント 1 の終了 IP はIP セグメント 2 と同じ 開始 IP は同じです;
4) IP セグメント 1 と IP セグメント 2 は単純に交差します。
2、Javaコードの実装
コードは以下のように表示されます:
/**
* @author Miracle Luna
* @date 2021/1/26
*/
public class IpUtil {
/**
* 判断两个IP段是否相交
* @param ipRange1 IP段1
* @param ipRange2 IP段2
* @return 是否相交
*/
public static boolean ipRange1IntersectIpRange2(String ipRange1, String ipRange2) {
String beginIp1 = ipRange1.split("-")[0];
String endIp1 = ipRange1.split("-")[1];
String beginIp2 = ipRange2.split("-")[0];
String endIp2 = ipRange2.split("-")[1];
return getIp2Long(endIp1) >= getIp2Long(beginIp2) && getIp2Long(endIp2) >= getIp2Long(beginIp1);
}
/**
* 将IP转换为Long类型
* @param ip 待转换的IP
* @return 转换为Long后的值
*/
public static long getIp2Long(String ip) {
// 去除空格
ip = ip.trim();
long ip2Long = 0L;
String[] ipSplits = ip.split("\\.");
for (String ipSplit : ipSplits) {
ip2Long = ip2Long << 8 | Integer.parseInt(ipSplit);
}
return ip2Long;
}
public static void main(String[] args) {
String ipRange1 = "192.168.166.10-192.168.166.216";
String ipRange2 = "192.168.166.100-192.168.166.218";
System.out.println("==> ipRange1IntersectIpRange2: " + ipRange1IntersectIpRange2(ipRange1, ipRange2));
}
}
操作の結果は次のようになります。
==> ipRange1IntersectIpRange2: true