UniQID関数は、PHPの組み込み関数の1つであり、現在の時間に基づいて一意のIDを生成するために使用されます。その構文は次のとおりです。
<span><span><span class="hljs-title function_ invoke__">uniqid</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$prefix</span></span><span> = </span><span><span class="hljs-string">""</span></span><span>, </span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-variable">$more_entropy</span></span><span> = </span><span><span class="hljs-literal">false</span></span><span>): </span><span><span class="hljs-keyword">string</span></span><span>
</span></span>
$プレフィックス:生成された一意のIDにプレフィックスされるオプションの文字列パラメーター。
$ more_entropy :boolean値は、生成されたIDにランダムな文字を追加するかどうかを決定し、その複雑さを増やし、デフォルトでfalseになります。
UniQIDの生成方法は、現在のタイムスタンプ(マイクロ秒)に基づいており、高精度が高いため、ほとんどの場合、生成されたIDは一意です。たとえば、 uniqid()を呼び出すと、 5f5d5e5c8f1a7に似たIDが取得されます。
UniQidは現在の時刻に基づいて一意の値を生成しますが、それはあまり安全ではありません。タイムスタンプは連続的に成長するため、 UniQIDが同時に複数回呼び出された場合、生成されたIDは同じかもしれません。さらに、デフォルトでUNIQIDによって生成されたIDはタイムスタンプに基づいているため、攻撃者がタイムスタンプが成長する順序を予測できる場合、生成されたIDは推測しやすくなります。
MT_RANDは、PHPの擬似ランダム数ジェネレーターです。 RAND関数と比較して、 MT_RANDはより効率的であり、高品質の乱数を生成します。構文は次のとおりです。
<span><span><span class="hljs-title function_ invoke__">mt_rand</span></span><span>(</span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$min</span></span><span> = PHP_INT_MIN, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$max</span></span><span> = PHP_INT_MAX): </span><span><span class="hljs-keyword">int</span></span><span>
</span></span>
$ min :生成された乱数の最小値、デフォルトはphp_int_minです。
$ max :生成された乱数の最大値、デフォルトはphp_int_maxです。
MT_RANDは、指定された範囲内でランダムな整数を返します。これは疑似ランダムですが、一般的な乱数要件には十分です。
MT_RANDは非常にランダムですが、依然として擬似ランダムであり、暗号的に安全な乱数ではありません。生成されたIDが高度なセキュリティである必要がある場合(推測や衝突の防止など)、十分に安全ではない場合があります。
一意のIDを生成するセキュリティを改善するために、 UniQIDとMT_RANDを一緒に使用できます。これにより、生成されたIDがタイムスタンプにランダム性を追加することが保証され、衝突の難しさが強化されます。
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">generateSecureId</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$prefix</span></span></span><span> = </span><span><span class="hljs-string">""</span></span><span>) {
</span><span><span class="hljs-comment">// 一意の時間ベースを生成します ID</span></span><span>
</span><span><span class="hljs-variable">$uniqid</span></span><span> = </span><span><span class="hljs-title function_ invoke__">uniqid</span></span><span>(</span><span><span class="hljs-variable">$prefix</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-comment">// 唯一 ID 乱数を追加します</span></span><span>
</span><span><span class="hljs-variable">$randomNumber</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mt_rand</span></span><span>(</span><span><span class="hljs-number">100000</span></span><span>, </span><span><span class="hljs-number">999999</span></span><span>);
</span><span><span class="hljs-comment">// スプライシングによって生成される一意 ID および乱数</span></span><span>
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$uniqid</span></span><span> . </span><span><span class="hljs-variable">$randomNumber</span></span><span>;
}
</span></span>
<span><span><span class="hljs-variable">$secureId</span></span><span> = </span><span><span class="hljs-title function_ invoke__">generateSecureId</span></span><span>(</span><span><span class="hljs-string">"order_"</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$secureId</span></span><span>;
</span></span>
出力は次のようになるかもしれません:
<span><span>order_60d17e5c5f1b4.829278031116635204001234
</span></span>
上記の方法では、 UNIQID関数は時間に基づいて一意の部分を生成し、 MT_RANDは高品質の擬似ランダム数を追加します。結合されたIDを予測するのはより困難です。これにより、タイムスタンプの独自性が保証されるだけでなく、複数の同一のIDを同時に生成する問題も回避できます。
ランダム性の増加:タイムスタンプに基づいてUniQIDによって生成されたIDには特定の順序があり、攻撃者によって推測される場合があります。 MT_RANDによって生成された乱数は予測不可能性を高め、IDを推測するのがより困難になります。
衝突の防止: UNIQIDのみを使用します。IDの生成間の時差が非常に小さい場合、衝突が発生する可能性があります(つまり、生成されたIDは同じです)。 MT_RANDの導入により、ランダム因子が追加され、衝突の確率が効果的に減少します。
セキュリティの改善:いくつかのシナリオ(支払いシステム、ユーザー検証など)では、IDには機密情報が含まれたり、推測を防ぐ必要がある場合があります。 UniQIDのみに依存している場合、セキュリティリスクがある可能性があり、 MT_RAND乱数を追加すると生成されたIDがさらに予測不可能になります。