ASINのencode/decode
2006-09-05-1
[Programming][Affiliate]
自分用メモ。
Perl で ASIN をぱっと見わからない文字列に可逆変換する方法を模索中。
モジュールなしで済ませたい。
(ref. [を] 日付文字列のencode/decode[2006-09-04-1])
↓今考えているやつ。未整理。
実行例:
Perl で ASIN をぱっと見わからない文字列に可逆変換する方法を模索中。
モジュールなしで済ませたい。
(ref. [を] 日付文字列のencode/decode[2006-09-04-1])
↓今考えているやつ。未整理。
#!/usr/bin/perl
use strict;
use warnings;
my @CHARS = split(//, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
my %CHAR2NUM = map {$CHARS[$_] => $_} (0..$#CHARS);
my @AIUEO = split(//, "aiueoAIUEO_");
my %AIUEO2NUM = map {$AIUEO[$_] => $_} (0..$#AIUEO);
foreach my $asin ("4844322893", "B000EQHU6M", "0123450000") {
my $e = aiueo_encode(asin_encode($asin));
my $d = asin_decode(aiueo_decode($e));
print "$asin =>(encode)=> $e =>(decode)=> $d\n";
}
sub asin_encode {
my ($asin) = @_;
my $sum = 0;
foreach (reverse split(//, $asin)) {
$sum *= @CHARS;
$sum += $CHAR2NUM{$_};
}
return $sum;
}
sub asin_decode {
my ($n) = @_;
my $asin;
for (1..10) {
my $r = $n % @CHARS;
$n = ($n - $r) / @CHARS;
$asin .= $CHARS[$r];
}
return $asin;
}
sub aiueo_encode {
my ($n) = @_;
my $c;
while ($n > 0) {
my $r = $n % @AIUEO;
$n = ($n - $r) / @AIUEO;
$c .= $AIUEO[$r];
}
return $c;
}
sub aiueo_decode {
my ($c) = @_;
my $sum = 0;
foreach (reverse split(//, $c)) {
$sum *= @AIUEO;
$sum += $AIUEO2NUM{$_};
}
return $sum
}
実行例:
% perl encode.pl 4844322893 =>(encode)=> uuoEIAuEI_aoIO =>(decode)=> 4844322893 B000EQHU6M =>(encode)=> oaUIAeAUeoOae_A =>(decode)=> B000EQHU6M 0123450000 =>(encode)=> ueAuOAOoi =>(decode)=> 0123450000
