PHPでランダムな16進数文字列を生成する方法

こんにちは、さるまりんです。

何でもいいからランダムな文字列が欲しい!

パスワードを決める時や何かしらぶつかりにくそうな文字列が必要なときに考えてみました。

欲しい情報は

  • 含まれる文字の種類
  • 結果の文字列の長さ

です。これらを決めるとプログラムで文字列を生成できます。PHPでやってみました。

文字と長さ指定でランダムな文字列を生成

長さと含まれる文字を文字列で受け取って結果を生成する関数です。

/**
 * 長さ$lengthの$lettersに含まれる文字による文字列を生成します。
 */
function generate_random_string($letters, $length) {
    // 結果を初期化
    $result = '';
    // $length回文字を$lettersからランダムに選び結果にする
    for ($i = 0; $i < $length; $i++) {
        // 1文字をピック
        $random_idx = rand(0, strlen($letters) - 1);
        $c = $letters[$random_idx];
        // 結果に追加
        $result .= $c;
    }
    // 結果を返却
    return $result;
}

16進数の文字列を生成

16進数の文字列を指定してgenerate_random_string($letters, $length)を呼び出すことで欲しい文字列ができます。

/**
 * 長さ$lengthの16進数の文字列を生成します。
 */
function generate_hex_string($length) {
    // 含まれる文字0〜9、a〜f
    $letters = "0123456789abcdef";
    // 上記を含む長さ$lengthの文字列を生成
    return generate_random_string($letters, $length);
}

長さに16を指定してgenerate_hex_string()を10回呼び出すプログラムです。

// 長さは16
$length = 16;
// 文字列を10回生成・表示
for ($i = 0; $i < 10; $i++) {
    echo $i . " " . generate_hex_string($length) . "\n";
}

実行すると次のように16進数の文字を含む文字列を10個生成します。

0 88b67664caf34a6b
1 96f2073b25cfda80
2 78018b3959eea009
3 332216d10d9e6aad
4 c8c07f104a487db7
5 27e53188dd4ff98b
6 4b3d0750e3d9e961
7 d660487d5e48b564
8 358f4c9ca97380ec
9 b705af0b9e24b33b

改良

$letters = "0123456789abcdef";

これでもいいんですが、0〜9、a〜fと指定できるといいかなと考えました。

$letters = '';
foreach(array_merge(range(0, 9), range('a', 'f')) as $c) {
    $letters .= $c;
}

range()は与えられた範囲の整数を持つ配列を作成します。array_merge()は複数の配列をマージする関数です。それを1文字ずつ繋いで$lettersを作るようにしました。ちょっと良くなったかな。

英数字の文字列を生成

上記の改良を利用して英数字の文字列を生成する関数を書いてみました。

/**
 * 長さ$lengthの英数字の文字列を生成します。
 */
function generate_alphanumeric_string($length) {
    // 含まれる文字0〜9、a〜z、A〜Z
    $letters = '';
    foreach(array_merge(range(0, 9), range('a', 'z'), range('A', 'Z')) as $c) {
        $letters .= $c;
    }
    // 上記を含む長さ$lengthの文字列を生成
    return generate_random_string($letters, $length);
}

一度作っておくと便利かな。考えていくと面白いですね。

読んでくださってありがとうございます。

ではまた!