重複しないユニークなidを生成する - Perl

ユーザーを識別するため、ファイルをサーバに保存するなど何らかの理由により重複しないIDを生成したい場合にはどうすれば良いだろうか?

通常のCGIであれば、CGI::Sessionなどを用いる方法もあるが、次のようなコードを書くことでも実現できる。以下のコードを動かすには、Digest::SHA1モジュールがインストールされていることが必要である。

サンプル

;#
;#セッションID
;#

use Digest::SHA1 qw(sha1_hex);

print genUniqID();

#----------------------------------------------#
#■ユニークなIDを生成する
#----------------------------------------------#
sub genUniqID{
  my $seed = shift || 'seed-string';
  my $id = join(''
          , $ENV{'REMOTE_ADDR'}
          , $ENV{'HTTP_USER_AGENT'}
          , time
          , $$
          , rand(9999)
          , $seed
      );

  return(sha1_hex($id));
}

実行結果

274397ee11444b04327eef344517d332446de0ef

ユーザーのIPアドレス、ブラウザ名(ユーザーエージェント)に加え時間、プロセスID、乱数、なにがしかの自由な文字列から構成されている。これらの文字列をそのまま連結してしまうと、セキュリティ的によろしくないため、不可逆な文字列に変換する。

ここではSHA1と呼ばれる方法を用いているが、場合によってはMD5などおなじみの方法でもかまわない。ただMD5はとある脆弱性を抱えており、それをSHA1が解決していると言われているため、なるべくSHA1を使っておいた方が良いだろう。

CGI::Sessionが使いたいという場合は、こちらのページを参照されたい。

perldoc.jp

関連ページ

MD5の脆弱性について

MD5、およびRIPEMDとよばれるハッシュ関数には理論的な弱点が存在することが明らかとなっている2004年8月、暗号の国際会議 CRYPTO (のランプセッション)にて、MD5のコリジョンを求めることができたという報告があった。理論的可能性として、MD5を用いて改竄されないことを確認する場合、あらかじめ正規のファイルと不正なファイルを用意しておき、正規のファイルを登録しておきながら、実際には不正なファイルに摩り替える攻撃がありえることを意味する。但し、実際にこの弱点を利用したクラッキングはまだ報告されていない。

「MD5」安全性の項より