zoukankan      html  css  js  c++  java
  • 用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;
      }

    }

  • 相关阅读:
    According to TLD or attribute directive in tag file, attribute end does not accept any expressions
    Several ports (8080, 8009) required by Tomcat v6.0 Server at localhost are already in use.
    sql注入漏洞
    Servlet—简单的管理系统
    ServletContext与网站计数器
    VS2010+ICE3.5运行官方demo报错----std::bad_alloc
    java 使用相对路径读取文件
    shell编程 if 注意事项
    Ubuntu12.04下eclipse提示框黑色背景色的修改方法
    解决Ubuntu环境变量错误导致无法正常登录
  • 原文地址:https://www.cnblogs.com/yanghaolie/p/9240334.html
Copyright © 2011-2022 走看看