セッションIDの構成文字

PHPがデフォルトで生成するセッションIDの構成文字は何だろう。
マニュアルにはsession_id関数で指定できるセッションIDに制限があることは記述されています。

セッションハンドラによっては、セッション ID として使用できる文字に 制限がある場合があります。例えば、ファイルによるセッションハンドラは セッション ID として使える文字は a-z A-Z 0-9 , (カンマ) そして - (マイナス) に限られます!

PHP: session_id - Manual

では、実際に生成される文字列はどうなのかわかりません。分からないなら調べます。

<?php
session_start();
$ids = array();$chars = array();for($i = 0; $i < 10000; $i++) {
$id = session_id();
foreach(str_split($id, 1) AS $char) {
$chars[$char] = isset($chars[$char])? $chars[$char]+1: 1;
}$ids[] = $id;session_regenerate_id();
}
ksort($chars);
var_export($chars);

結果は

array ( 0 => 9157, 1 => 8933, 2 => 9067, 3 => 8915, 4 => 9036, 5 => 9130, 6 => 9105, 7 => 8984, 8 => 7743, 9 => 7803, 'a' => 7886, 'b' => 7938, 'c' => 7704, 'd' => 7896, 'e' => 7814, 'f' => 7882, 'g' => 8051, 'h' => 7687, 'i' => 7775, 'j' => 7891, 'k' => 7708, 'l' => 7761, 'm' => 7896, 'n' => 7767, 'o' => 7846, 'p' => 7875, 'q' => 7753, 'r' => 7938, 's' => 7689, 't' => 7833, 'u' => 7676, 'v' => 7861, )

0-9a-vらしいです。記号どころかwxyzすら出てきません。32進表示表示らしいです。

一応、ソースも見てみます

// ext/session/session.c line.343
PHPAPI char *php_session_create_id(PS_CREATE_SID_ARGS) /* {{{ */
// 省略
if (PS(hash_bits_per_character) < 4
                        || PS(hash_bits_per_character) > 6) {
                PS(hash_bits_per_character) = 4;

                php_error_docref(NULL TSRMLS_CC, E_WARNING, "The ini setting hash_bits_per_character is out of range (should be 4, 5, or
 6) - using 4 for now");
        }
        j = (int) (bin_to_readable((char *)digest, digest_len, buf, PS(hash_bits_per_character)) - buf);

あれ?bin_to_readableがバイト列を文字列に変換してるらしいですけど、その前にhash_bits_per_characterとか言う設定値がどうのとういう警告投げる個所が……

session.hash_bits_per_character により バイナリのハッシュデータを何らかの可読なデータに変換する際、 それぞれの文字に何ビットストアさせるかを定義することが可能です。 指定可能な値は、'4' (0-9, a-f)、'5' (0-9, a-v) そして '6' (0-9, a-z, A-Z, "-", ",") です。

PHP: 実行時設定 - Manual

遠回りをしてしまいましたがデフォルトのセッション生成を使う場合session.hash_bits_per_characterによって1文字あたりの情報量、翻って構成文字が設定できるということでした。