0

我正在使用以下代码来比较返回的 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。

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

4

1 回答 1

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 如何在幕后进行IP 黑名单。查看命名的函数以in_domain获得一些灵感。

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

于 2013-06-16T20:15:10.773 回答