4

乱数関数の目的は、予測できない(または確実に予測するのが非常に難しい)乱数を取得することです。関数mt_rand()が古いものよりも高速で予測可能性が低い(「ランダム」である)場合はrand()、基礎となる実装を新しいメソッドに切り替えてみませんか?

別の言い方をrand()すれば、基礎となる実装が変更された場合、またはそのために、使用するどのような種類のプログラムが新しいバージョンのPHPで機能しなくなるでしょうか。

4

3 に答える 3

6

主な理由は、それが PHP のやり方だからです。mysql_real_escape_string彼らがそれに置き換えるのではなく追加したのと同じようにmysql_escape_string

ただし、メルセンヌツイスターアルゴリズムの欠点にも関連している可能性があります(ただし、アルゴリズムにも存在するかどうかはわかりませんrand())。

ネイティブ形式のアルゴリズムは暗号化には適していません (Blum Blum Shub とは異なります)。十分な数の反復 (MT19937 の場合は 624、この数字は将来の反復が生成される状態ベクトルのサイズであるため) を観察することで、将来のすべての反復を予測できます。メルセンヌツイスターからの出力に基づく暗号ストリーム暗号のペアが松本誠らによって提案されました。著者は、カウンター モードで Advanced Encryption Standard よりも 1.5​​ 倍から 2 倍高速であると主張しています。ウィキペディア

もう 1 つの問題は、ランダムでない初期状態 (特に多数のゼロの存在) をランダム性テストに合格する出力に変換するのに長い時間がかかることです。小さなラグ フィボナッチ ジェネレーターまたは線形合同法ジェネレーターは、はるかに迅速に開始され、通常、メルセンヌ ツイスターにランダムな初期値をシードするために使用されます。ウィキペディア

于 2012-07-17T17:52:46.027 に答える
3

どちらのアルゴリズムも疑似ランダムです。これは、初期条件を知ることで、将来のすべての反復を知ることができることを意味します。誰かがそのような実装の詳細に依存しているかどうか(つまり、関数の意図ではなく関数の実装に依存しているかどうか)を知ることは不可能であるため、新しい関数を作成する方が安全です。

于 2012-07-17T17:59:16.907 に答える