scratchpad
steve
<code>
sub _in_cidr_dns {
my ($cidr,$addr) = @_;
my ($start, $range) = split /\//, $cidr;
require DNS;
my $start_dec = DNS::aton($start);
my $addr_dec = DNS::aton($addr);
return $addr_dec >= $start_dec && $addr_dec < $start_dec + 2 ** (32 - $range);
}
sub _in_cidr_aton {
my ($cidr,$addr) = @_;
my ($start, $range) = split /\//, $cidr;
my $start_dec = unpack("N", pack("C4", split m/\./x, $start));
my $addr_dec = unpack("N", pack("C4", split m/\./x, $addr));
return $addr_dec >= $start_dec && $addr_dec < $start_dec + 2 ** (32 - $range);
}
sub _in_cidr_socket {
my ($cidr,$addr) = @_;
my ($start, $range) = split /\//, $cidr;
require Socket;
my $start_dec = unpack("N*",Socket::inet_aton($start));
my $addr_dec = unpack("N*",Socket::inet_aton($addr));
return $addr_dec >= $start_dec && $addr_dec < $start_dec + 2 ** (32 - $range);
}
sub _in_cidr_bin {
my ($cidr,$addr) = @_;
my ($start, $range) = split /\//, $cidr;
my $start_binary = _ipv4_to_32bitbinary($start);
my $addr_binary = _ipv4_to_32bitbinary($addr);
my $starts_with = substr($start_binary,0,$range);
return $addr_binary =~ /^$starts_with/;
}
sub _ipv4_to_32bitbinary { join "", map {sprintf "%08b", $_} split /\./, shift; }
</code>
<pre>
Rate bin dns aton socket
bin 595/s -- -54% -64% -73%
dns 1282/s 115% -- -23% -41%
aton 1667/s 180% 30% -- -23%
socket 2174/s 265% 70% 30% --
</pre>