はじめに
PHP uniqid() 関数を使用すると、マイクロ秒単位の現在のタイムスタンプに基づいて、繰り返されない一意の識別子を生成できます。同時実行性が高い場合、または間隔が非常に短い場合 (ループ コードなど)、大量の重複データが表示されます。 2 番目のパラメーターが使用された場合でも、それは繰り返されます。最適な解決策は、md5 関数を組み合わせて一意の ID を生成することです。
関数
string uniqid ([ string $prefix = "" [, bool $more_entropy = false ]] )
を使用して、現在の時刻のマイクロ秒数に基づいてプレフィックス付きの一意の ID を取得します。プレフィックス 便利なパラメータ。たとえば、複数のホスト上にある場合、同じマイクロ秒内に一意の ID が生成される可能性があります。 prefix が空の場合、返される文字列の長さは 13 です。 moreentropy が TRUE の場合、返される文字列の長さは 23 です。 moreentropy TRUE に設定すると、uniqid() は返された文字列の末尾に追加のエントロピーを追加します (結合線形合同生成器を使用)。固有 ID をより固有なものにします。
このメソッドは、大量の反復データを生成します。次の PHP コードを実行すると、一意の識別子と対応する要素の値が生成されます配列インデックス内の は、一意の識別子が繰り返される回数です。
<?php $units = array();for($i=0;$i<1000000;$i++){ $units[] = uniqid();} $values = array_count_values($units); $duplicates = [];foreach($values as $k=>$v){ if($v>1){ $duplicates[$k]=$v; }} echo '<pre class="brush:php;toolbar:false">';print_r($duplicates); echo '';?>
このメソッドによって生成される重複する一意の識別子の量は大幅に削減されます。
<?php $units = array();for($i=0;$i<1000000;$i++){ $units[] = uniqid('',true);} $values = array_count_values($units); $duplicates = [];foreach($values as $k=>$v){ if($v>1){ $duplicates[$k]=$v; }} echo '<pre class="brush:php;toolbar:false">';print_r($duplicates); echo '';?>
このメソッドによって生成される一意の ID には重複がありません。
<?php $units = array();for($i=0;$i<1000000;$i++){ $units[]=md5(uniqid(md5(microtime(true)),true));} $values = array_count_values($units); $duplicates = [];foreach($values as $k=>$v){ if($v>1){ $duplicates[$k]=$v; }} echo '<pre class="brush:php;toolbar:false">';print_r($duplicates); echo '';?>
sessioncreateid() 関数を使用して一意の識別子を生成します。実際のテストの結果、sessioncreateid() が周期的に呼び出されても問題ないことがわかりました。 1億回、重複はありません。 php sessioncreateid() は PHP 7.1 の新しい関数であり、セッション ID を生成するために使用されます。これより前のバージョンでは使用できません。
PHP 関連の知識の詳細については、PHP 中国語 Web サイト をご覧ください。
以上がPHPは一意のIDを生成しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。