From: Michal L. <ml...@lo...> - 2009-08-20 22:53:47
|
Lionel Bouton wrote: > I discouraged elaborate matchers for a reason : they are slow. > If you use full IP or class-c, you are looking up a hash entry. If you > do regex or prefix-based matching, this can become a full sequential > search on a list and this part of the code is hit on each and every mail > so it better be fast. It needn't be slow if done smartly ;-) What I have already (mostly) ready for checkin is roughly: - instead of current $whitelist{IP}{ip} and $whitelist{C}{ip} have $whitelist{prefixlen}{ip} (and similar for IPv6). For example the entries would be: $whitelist{24}{"1.2.3.0"} $whitelist{24}{"10.20.30.0"} $whitelist{16}{"123.123.0.0"} - Then for each incoming IP: foreach $prefix (sort(keys $whitelist)) { $masked_ip = apply_prefix($ip, $prefix); // Whitelist match? return 1 if (defined $whitelist{$prefix}{$masked_ip}); } Since there's not likely to be more than a handful of different prefix-lenghts in $whitelist the overhead over the current implementation is marginal. Instead of current two hash lookups (in ->{IP} and ->{C}) it may do perhaps three or four lookups, depending on the number of different prefix-lengths. Definitely nowhere near sequential search, don't worry ;-) > Git (or Mercurial) would allow us to branch easily to prepare the fixes > for 1.8.0 and the evolutions for 1.8.x at the same time. But Mercurial > would be a speed bump for me :-( I vote for SVN ;-) Then you can use git-svn, can't you? I never used it myself though. Michal -- * http://smtp-cli.logix.cz - the ultimate command line smtp client |