お手軽にシリアル番号が作りたい。
とりあえずCPANを探したけどどれもゴツイ。
ようは
文字(ローテーション)→数字(ビット計算)→文字(ローテーション)
をちょこっとしてもらえばいいのだが...
深く考えなければ、
#!/usr/bin/perl
use strict;
use warnings;
my $dicstr1 = '*o1WeAILgDfH2t3Qa8ZMEpRJi0cwx5mYKud9zqByUhVslkS6jbOFG4P7XTCNrnv';
my $dicstr2 = '67NPUVWXQ5FG2KLCZMHJ49B8DEYARST3';
# a1X12345
my $text_i = str2int('a1X', $dicstr1);
my $text_i_s = int2str($text_i, 4, $dicstr2);
my $num_s = int2str(12345, 4, $dicstr2);
print $text_i_s, '-', $num_s, "\n";
my $text_i_s_i = str2int($text_i_s, $dicstr2);
my $text_i_s_i_s = int2str($text_i_s_i, 4, $dicstr1);
my $num_s_i = str2int($num_s, $dicstr2);
print $text_i_s_i_s, '-', $num_s_i, "\n";
exit;
sub str2int
{
my $instr = shift || 'A';
my $dicstr = shift || join('', '*', 'A'..'Z', 'a'..'z', 0..9);
my $reint = 0;
for(my $i = 0; $i < length($instr); $i++)
{
$reint += index($dicstr, substr($instr, length($instr) - $i - 1, 1))
* (length($dicstr) ** $i);
}
return $reint;
}
sub int2str
{
my $instr = shift || 0;
my $length = shift || 8;
my $dicstr = shift || '23456789ABCDEFGHJKLMNPQRSTUVWXYZ';
my $restr ='';
do
{
$restr = substr($dicstr, $instr % length($dicstr), 1) . $restr;
$instr = int($instr / length($dicstr));
}
while($instr);
return substr(substr($dicstr, 0, 1) x $length . $restr, length($restr));
}
こんなの。
090728 追記
よく考えるとシリアル番号になってなかったのでもっとシリアル番号ぽいものにしてみる。
コメントする