Category: | |
Author/Contact Info | Adam |
Description: | This was spawned from the code in RE: RE: RE: Randomizing Unique ID? and is a subroutine that you are welcome to steal. It allows base conversions to and from base 10 to any base from 2 to 62. (less then 2 would be pointless.) It only handles non-negative integers, as I didn't feel like exploring the realm of sign bits, twos-complement, and mantissas. Enjoy. |
# Change the base representation of a non-negative integer use strict; sub GenerateBase { my $base = shift; $base = 62 if $base > 62; my @nums = (0..9,'a'..'z','A'..'Z')[0..$base-1]; my $index = 0; my %nums = map {$_,$index++} @nums; my $To = sub { my $number = shift; return $nums[0] if $number == 0; my $rep = ""; # this will be the end value. while( $number > 0 ) { $rep = $nums[$number % $base] . $rep; $number = int( $number / $base ); } return $rep; }; my $From = sub { my $rep = shift; my $number = 0; for( split //, $rep ) { $number *= $base; $number += $nums{$_}; } return $number; }; return ( $To, $From ); } =Example usage: my( $ToBase62, $FromBase62 ) = GenerateBase( 62 ); my $UniqueID = $ToBase62->( $$ ) . $ToBase62->( time ); my $hex = (GenerateBase(16))[0]; print $hex->( '28' ); =cut |
Back to
Code Catacombs