用bitSet做百万级ip去重

如果直接将几百万数据仍到bitset,内存是否够用?实际测试,600万ip放到一个bitSet中,jvm内存会爆。

所以,就简单做了下分组,构建一个HashMap<String, BitSet>,

以192.168.6.2为例,将192.168直接截取为字符串,当作hashmap的key,后2位补零为006002,将006002放入“192.168”分组的bitSet中。

适用场景:

    这种构建bitSet的去重方式,适合判断某个ip是否在百万级的ip集合中。

 不适用输入一个百万级ip集合,去重后输出这个结果集。

代码如下:

import java.util.BitSet;
import java.util.HashMap;

public class DistcIp {

public static void main(String[] args) {
  HashMap<String, BitSet> groupBitSet=new HashMap<String, BitSet>();
  //先遍历ip,
  String ip1="192.168.0.3";
  String ip2="192.168.0.4";
  String ip3="192.162.0.6";
  String ip4="192.162.0.6";
  String ip5="192.157.0.4";

  String[] strs=new String[] {ip1,ip2,ip3,ip4,ip5};

  for (String cip : strs) {
  String group=getBitSetGroup4IP(cip);
  int value=getBitSetValue4IP(cip);
  if(groupBitSet.containsKey(group)) {
    groupBitSet.get(group).set(value);
  }else {
    BitSet bs= new BitSet();
    bs.set(value);
    groupBitSet.put(group, bs);
  }
 }

  String group2=getBitSetGroup4IP(ip1);
  int value2=getBitSetValue4IP(ip1);
  BitSet bs=groupBitSet.get(group2);
  System.out.println(bs.get(value2));

  String group3=getBitSetGroup4IP("192.168.0.1");
  int value3=getBitSetValue4IP("192.168.0.1");
  BitSet b3=groupBitSet.get(group3);
  System.out.println(b3.get(value3));

}

  /**
  * 用来构建BitSet数值;
  * @param ip
  * @return int
  */
  static int getBitSetValue4IP(String ip){
    String[] ips=ip.split("\\.");
    if(ips.length!=4) return 0;
    String tmp=formatVal(ips[2])+formatVal(ips[3]);
    return Integer.valueOf(tmp);
  }

  /**
  * 用来构建BitSet分组;
  * @param ip
  * @return String
  */
  String getBitSetGroup4IP(String ip){
    String[] ips=ip.split("\\.");
    if(ips.length!=4) return null;
    return ips[0]+"."+ips[1];
  }

  //这个是用来补零的,如:125.42.1.8 ->125.042.001.008
  static String formatVal(String s) {
    String res="";
    char[] ca=s.toCharArray();
    for(int i=ca.length;i<3;i++) {
      res+="0";
    }
    return res+s;
  }

}

 

posted @ 2018-06-28 19:28  Nucky_yang  阅读(1584)  评论(0编辑  收藏  举报