我正在使用以下代码来比较返回的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。
这样可行,但似乎有一种更有效的方法可以做到这一点。只是好奇,如果有人有任何建议简化这个或使其更有效。当我介绍这个时,我的请求时间几乎翻了一倍,如果可能的话,我想挤出一些加载时间。
答案 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不会阻止工作的开销。已经发生了。
我有两个想法:
由于IP地址无论如何都是字符串,*符号本身适合正则表达式来完成工作,而不是分裂和比较?所以也许作为下一步,你可以考虑实现一个正则表达式来完成工作,而不是.split()并比较,并测试它的性能?
或者也许弄清楚如何避免与比较各部分相关的开销,并在可能时比较整体?然后,只有在必要时才需要比较各部分。
如果你想阅读一些C代码,这里是幕后的Apache does IP blacklisting。查看名为in_domain
的函数以获得一些灵感。