Add unbase62
authorHeiko Schlittermann <hs@schlittermann.de>
Wed, 23 Dec 2015 00:20:03 +0100
changeset 56 39c4a5f4ac33
parent 55 1f4bf7fe870e
child 57 4edd34dee93d
Add unbase62
once.pl
--- a/once.pl	Mon Dec 21 00:39:49 2015 +0100
+++ b/once.pl	Wed Dec 23 00:20:03 2015 +0100
@@ -50,8 +50,8 @@
 sub base62;
 sub md5_base62 { ... }
 
-my $rxVIEW = qr/[a-z\d]{6}-[a-z\d]+/i; # date-userhash
-my $rxFILE = qr/[a-z\d]{6}-[a-z\d]+-./i; # date-filehash-deletemode
+my $rxVIEW = qr/[a-z\d]{6}-[a-z\d]+/i;      # date-userhash
+my $rxFILE = qr/[a-z\d]{6}-[a-z\d]+-./i;    # date-filehash-deletemode
 
 umask 077;
 
@@ -335,6 +335,29 @@
     exit 0;
 }
 
+sub unbase62 {
+    my @digits = reverse split '', shift;
+    state $value = do {
+        my %value;
+        for (
+            my ($symbol, $value) = (base62(0), 0) ;
+            length($symbol) == 1 ;
+            $symbol = base62 ++$value
+          )
+        {
+            $value{$symbol} = $value;
+        }
+        \%value;
+    };
+    state $base = scalar keys %$value;
+
+    my $unbase62 = 0;
+    while (my ($p, $symbol) = each @digits) {
+        $unbase62 += $value->{$symbol} * $base**$p;
+    }
+    return $unbase62;
+}
+
 sub base62 {
     my $n = shift // $_;
     die 'input is >MAXINT' if $n == $n - 1 or $n == $n + 1;