使用Postgres的IPv4最长前缀匹配

时间:2014-06-10 08:26:41

标签: postgresql ipv4 longest-prefix

如果IP地址为192.168.0.1,并且存储子网IP地址的列为next_hop_subnet,您是否发现以下PostGRESQL逻辑,准确性或性能方面存在任何问题:

minDif := select min(abs(inet '192.168.0.1' -  next_hop_subnet::inet)) 
         from routing_table 
         where next_hop_subnet::inet >>= inet '192.168.0.1';

select * 
from routing_table 
where next_hop_subnet::inet >>= inet '192.168.0.1' 
      AND abs(inet '192.168.0.1' -  next_hop_subnet::inet) = minDif;

因为,可以有多个同样好的比赛,我认为没有办法,只能分两步完成。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我会使用masklen(inet)函数来排序答案,例如:

SELECT * FROM routing_table
 WHERE next_hop_subnet::inet >>= inet '192.168.0.1'
 AND masklen(next_hop_subnet::inet) = (
     SELECT masklen(next_hop_subnet::inet) FROM routing_table
     WHERE next_hop_subnet::inet >>= inet '192.168.0.1')
     ORDER BY masklen(next_hop_subnet::inet) DESC
     LIMIT 1
 );

这样您就可以从路由表中获得最长的匹配前缀。