概要
- 重複のないランダムなキーの一群を作る。
- キーの長さと使用可能文字数が、キーの個数に対して十分かどうかチェック。(2007/06/18)
- Text::CSV_XS, Win32::Unicode::Native を使用するようにした。(2013/06/07)
ソース
-
createUniqKeyList.zip
# ユニークキー作成スクリプト # by take-ash # 2013.06.07 # # 重複のないランダムなキーの一群を作る。 use strict; use warnings; use utf8; use Encode; use Text::CSV_XS; use Win32::Unicode::Native; my $charsetFile = 'UTF-8'; my $fileNameOut = 'uniqueKeys.txt'; # 出力ファイル名。 my $keyLength = 6; # キーの長さ my $keyMax = 50; # キーの個数 my $possibleChar = # 使用可能文字 # 'あいうえお' . 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' . 'abcdefghijklmnopqrstuvwxyz' . '0123456789'; my $keyCharMax = length( $possibleChar ); if ( ( $keyCharMax ** $keyLength ) < $keyMax ){ die( "Too short KeyLength or Too few PossibleChar against KeyMax.\n" ); } my %keyPool = (); my @keyList = ( [ 'ID', 'Key' ] ); srand( time ); $| = 1; for( my $i=1; $i <= $keyMax; ++$i ){ printf( "%d/%d\r", $i, $keyMax ); my $tmpKey = makeNewKey(); while( $keyPool{ $tmpKey } ){ $tmpKey = makeNewKey(); } $keyPool{ $tmpKey } = 1; push( @keyList, [ $i, $tmpKey ] ); } print "\n"; $| = 0; my $csv = Text::CSV_XS->new({ binary => 1, sep_char => "\t", eol => $/ }); open( my $OUT, ">:encoding($charsetFile)", $fileNameOut ) or die( "$fileNameOut: $!\n" ); foreach my $row ( @keyList ){ $csv->print( $OUT, $row ); } close( $OUT ); exit; sub makeNewKey { my $result = ''; while( length( $result ) < $keyLength ){ $result .= substr( $possibleChar, int( rand( $keyCharMax ) ), 1 ); } return $result; } # EOF