Efficient sorting of SNMP oids
Peter Corlett
abuse at cabal.org.uk
Sat Oct 31 19:51:58 GMT 2009
On 31 Oct 2009, at 16:03, B Maqueira wrote:
> I need to sort eficiently a large array (~9000) of SNMP OIDs.
>
> I am currently trying the following code:
>
> my @sorted_oids = map { $_->[0] }
> sort { $a->[1] cmp $b->[1] }
> map { [$_, pack('w*', split(/\./,
> $_))] } @oids;
>
> But this fails since it outputs 1.3.6.1.4.1.2333.3.2.61001.1.10 before
> than 1.3.6.1.4.1.2333.3.2.8080.1.1.1
>
> Any ideas?
That's because "w" format is a BER encoding, and this does not map
integers into strings such that ordering is maintained. For example,
16383 encodes to "\xff\x7f", but 16384 encodes to "\x81\x80\x00" which
string-sorts earlier.
Relatively few encodings *do* maintain that ordering. Big-endian fixed-
width does. So I'd use "N*" instead in your pack format, mainly
because I'm not entirely sure whether the components of SNMP OIDs can
ever be greater than 65535 and thus whether I could thus get away with
"n*" to halve the storage required.
More information about the london.pm
mailing list