给定一个范围列表,我们如何找到节点js中该范围列表中是否存在给定值

时间:2017-09-13 17:24:49

标签: javascript node.js intervals interval-tree

我有一组ip范围,我需要查找用户给出的ip是否存在于给定的ip范围列表之间。

这是对这个问题的继续

How to check if a given ip falls between a given ip range using node js

Jonas帮助我获得了ip存在与否。但我不想进行详尽的迭代搜索,我想进行快速性能密集型搜索,因为我的ip范围(或数字范围)列表将是巨大的。

我看着jonas指出的绽放过滤器,但我不相信绽放过滤器可能会有所帮助。我也在看Interval Tree但我认为它可以搜索间隔,它需要间隔作为输入。

我的IP列表范围为https://github.com/client9/ipcat/blob/master/datacenters.csv#L4

如何快速搜索它。我正在使用节点js

1 个答案:

答案 0 :(得分:0)

我观察过你的许多ips看起来像这样:

123.123.123.0 - 123.123.123.255

所以要过滤它们,我们只需要阻止每个ip开始:

123.123.123

现在只有16E6的ip范围被阻止。但是你可能会阻止它们中的一些,这使我们能够将它存储在一个Set中。一点代码:

const blockedRange = new Set();

function IPtoBlock(ip){
   return ip.split(".").slice(0,3).join(".");
}

//to block an ip range ( if youve got one ip of it):
blockedRange.add( IPtoBlock("192.168.2.48") );

//to check for an ip
blockedRange.has( IPtoBlock( someip ));

所以现在只有一些范围不是块,例如:

 5.44.26.144 - 5.44.26.159

但是,嘿,只有15 ips,我们可以通过ip list添加禁令:

const blockedIPs = new Set();

function NumtoIP(num){
  return (num+"").split("").reduce((res,char,i) =>
    res + (!i || i%3?"":".") + (char === "0"?"":char)
  ,"");
 }

function addRange(start,end){
 start = IPtoNum(start);
 end = IPtoNum(end);//include from last answer
 for(var i = start; i <= end; i++){
   blockedIPs.add( NumtoIP( i ) );
 }
}

因此,当迭代我们的范围列表时,我们可以分开:

ranges.forEach(([min,max]) => {
  if( min.substr(-1) === "0" && max.substr(-3) === "255" ){
      blockedRange.add( IPtoBlock( min ) );
  }else{
      addRange(min, max);
  }
});

检查ip是否未通过检查

function isBlocked(ip){
  return blockedIPs.has(ip) && blockedRange.has( IPtoBlock(ip) );
 }