用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;
  }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM