先日、PHPのセッション絡みの障害があり、調べてみました。何かというと「セッションIDが重複することがあるのか」ということについて。
PHP4.3.9のソースで見てみるとextというディレクトリがあります。これは拡張機能関連のソースがある場所のようで、pgsqlやmingやxmlなどが入ってます。ここにsessionディレクトリもありました。。拡張といっても本当のコア機能以外は全部ここに入っているようです。
php-4.3.9/ext/session の中のsession.cを見てみるとphp_session_create_idという露骨な名前の関数が定義されています。中身は大雑把に見ると、時間と php_combined_lcg()をMD5でハッシュ化しているようです。php_combined_lcgをググってみると、
[PHP-users 11996] Re: 「他人の情報を表示するサイト」php_combined_lcgはマルチプロセスサーバー(プロセスをフォームするサーバー) ではPIDをマルチスレッドサーバーではthread_idを利用して疑似乱数を生成してい ます。したがって、仮に、micro秒単位で同じ時刻にアクセスしても同じセッション IDは生成されません。
msessionはセッション情報を全てメモリに保持しているのでセッションID のコリージョンを検出しています。
どうやらPHPのセッションIDは理論的に絶対に重複しないようです。でもこれって、Webサーバが複数ある状態で1つのDBにセッションを保存している場合、同じ時刻で偶然プロセスIDも一緒だったら重複しちゃうんじゃないでしょうか。もう少し調べてみたいです。
2005/05/17 追記: 一部間違いがありました。 ref: PHPのセッションID2