#! perl -slw use strict; use Time::HiRes qw[ time ]; my @c1 = (' ', '0'..'9', 'A'..'Z' ); sub fromB37 { my $n = shift; my $s = ' '; substr( $s, $_, 1, $c1[ $n%37 ] ), $n /= 37 for 0 .. 5; $s; } my @c2; $c2[ ord( $c1[ $_ ] ) ] = $_ for 0 .. 36; sub toB37 { my $n = 0; $n = $n * 37 + $c2[$_] for reverse unpack 'C*', $_[0]; $n; } my $start = time; for ( 1 .. 1e6 ) { my $s = fromB37( rand 37**6 ); } printf "fromB37 took %.3f seconds/million\n", time() - $start; $start = time; for ( 'AAAAA' .. 'CEXHN' ) { my $n = toB37( $_ ); } printf "toB37 took %.3f second/million\n", time() - $start; my @data = map int( rand 37**6 ), 1 .. 1e6; $start = time; $_ == toB37( fromB37( $_ ) ) or die $_ for @data; printf "Both ways took %.3f second/million\n", time() - $start; __END__ C:\test>junk45 fromB37 took 5.309 seconds/million toB37 took 3.234 second/million Both ways took 8.953 second/million