PHP:
乱数の生成
方法:
PHPは乱数を生成するためのいくつかの関数を提供していますが、最も一般的に使用されるのはrand()
、mt_rand()
、そして暗号化目的でのrandom_int()
です。
0からgetrandmax()(rand()
によって返される可能性のある最大値)の間のシンプルな乱数を生成するには、次のコードを使います:
echo rand();
より特定の範囲、たとえば1から100の間で生成するには:
echo rand(1, 100);
しかし、速度とランダム性の観点からmt_rand()
を使用することがより良い選択です:
echo mt_rand(1, 100);
出力はランダマイゼーションに依存して1から100の間の任意の数、例えば42
になります。
暗号化またはセキュリティの文脈では、予測不可能性が重要である場合、システムの乱数生成器からランダムバイトを使用して暗号学的に安全な疑似乱数整数を生成するrandom_int()
が推奨されます:
echo random_int(1, 100);
再び、出力は1から100の間のランダムな数、例えば84
になりますが、ランダム性の強い保証があります。
深掘り
rand()
関数はPHPの初期バージョンから存在しており、乱数を生成するための初期的なアプローチとして機能してきました。しかし、比較的予測可能なアルゴリズムのため、高度なランダム性が求められるアプリケーションには最良の選択ではありません。
PHP 4で導入されたmt_rand()
は、Mersenne Twisterアルゴリズムに基づいており、「rand()`と比べて生成できる速度と乱数の観点からはるかに優れています。それはすぐに非暗号化ニーズのための好ましいオプションとなりました。
セキュリティに敏感なアプリケーションのために、PHP 7では、システムの乱数生成器からのランダムバイトを使用して暗号学的に安全な疑似乱数整数を生成するrandom_int()
が導入されました。これは、rand()
やmt_rand()
よりもはるかに安全であり、予測可能性がセキュリティの脆弱性につながる可能性のあるトークン、キー、またはその他の要素の生成に最適な選択です。
これらの改善にもかかわらず、アプリケーションのコンテキストに基づいて適切な関数を選択することが重要です。一般的な用途にはmt_rand()
が十分ですが、対象とされたり、悪用される可能性があるものには、ランダム性とセキュリティの両方を提供するrandom_int()
が行くべき道です。