お手軽にシリアルナンバが作りたいけど

| コメント(0) | トラックバック(0)

お手軽にシリアル番号が作りたい。
とりあえず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 追記
よく考えるとシリアル番号になってなかったのでもっとシリアル番号ぽいものにしてみる

トラックバック(0)

トラックバックURL: http://uwi.but.jp/mt/mt-tb.cgi/274

コメントする

このブログ記事について

このページは、uwiが2009年7月27日 14:58に書いたブログ記事です。

ひとつ前のブログ記事は「公共事業や公共工事についての発言」です。

次のブログ記事は「もっとシリアル番号ぽいものにしてみる」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。