NodeJS(通用JS)比较IP地址

时间:2013-06-16 14:47:32

标签: javascript arrays node.js comparison

我正在使用以下代码来比较返回的IP地址(使用类似于express的node-restify):

var checkIP = function (config, req) {
    var ip = req.connection.remoteAddress.split('.'),
        curIP,
        b,
        block = [];
    for (var i=0, z=config.ips.length-1; i<=z; i++) {
        curIP = config.ips[i].split('.');
        b = 0;
        // Compare each block
        while (b<=3) {
            (curIP[b]===ip[b] || curIP[b]==='*') ? block[b] = true : block[b] = false;
            b++;
        }
        // Check all blocks
        if (block[0] && block[1] && block[2] && block[3]) {
            return true;
        }
    }
    return false;
};

config.ips包含一个数组(从代码中可以明显看出)可以是特定的或通配的IP。

这样可行,但似乎有一种更有效的方法可以做到这一点。只是好奇,如果有人有任何建议简化这个或使其更有效。当我介绍这个时,我的请求时间几乎翻了一倍,如果可能的话,我想挤出一些加载时间。

1 个答案:

答案 0 :(得分:0)

如果我的直觉是正确的,你现在可能正在做一些额外的工作:

对于config.ips数组中的每个IP表达式,您的代码都在解析和比较:

if (block[0] && block[1] && block[2] && block[3]) {
        return true;
 }

^^^请注意,您已经完成了在每个IP计算此表达式4次的迭代中获取所有4个块的工作:(curIP[b]===ip[b] || curIP[b]==='*'),因此上面的ANDing不会阻止工作的开销。已经发生了。

我有两个想法:

  1. 由于IP地址无论如何都是字符串,*符号本身适合正则表达式来完成工作,而不是分裂和比较?所以也许作为下一步,你可以考虑实现一个正则表达式来完成工作,而不是.split()并比较,并测试它的性能?

  2. 或者也许弄清楚如何避免与比较各部分相关的开销,并在可能时比较整体?然后,只有在必要时才需要比较各部分。 如果你想阅读一些C代码,这里是幕后的Apache does IP blacklisting。查看名为in_domain的函数以获得一些灵感。

  3. 祝你好运,希望这会有所帮助!