解决IP匹配查询的方案

来源:互联网 发布:手机自动关闭数据连接 编辑:程序博客网 时间:2024/06/11 10:24

需求

一个列表对IP段进行匹配查询

1. 匹配格式正确而且数据库有相应的数据则返回相应的数据
2. 匹配格式非法或者数据库没有相应的数据则返回空列表

方案

IP正则表达式

//iPv4的ip地址都是(1~255).(0~255).(0~255).(0~255)的格式String regexStr = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."+"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."+"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."+"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$";

工具类IP2LongUtils

public class IP2LongUtils {    public static Long ipToNumber(String ip) {              Long ips = 0L;           String[] numbers = ip.split("\\.");          for (int i = 0; i < 4; ++i) {              ips = ips << 8 | Integer.parseInt(numbers[i]);          }          return ips;         }          public static String numberToIp(Long number) {              String ip = "";          for (int i = 3; i >= 0; i--) {              ip  += String.valueOf((number & 0xff));              if(i != 0){                  ip += ".";              }              number = number >> 8;          }          return ip;            }  }

postgresql ip2int函数

SELECT split_part($1,'.',1)::bigint*16777216 + split_part($1,'.',2)::bigint*65536 + split_part($1,'.',3)::bigint*256 + split_part($1,'.',4)::bigint;

总结

由于不同公司有不同的代码风格,这里我并没有把完整的代码贴出来,只根据这几个核心的代码他人有同样的需求的话应该也可以做出来的。技术不难,难的是有没有心做得最好而已!这功能是我接替别人的,他的代码实在是惨不忍睹,所以就重新做了这个功能!希望能给大家一个参考的意见吧!

原创粉丝点击