11

PHP の uniqid() は、マイクロ秒単位の現在のタイムスタンプに基づいて一意の ID を生成します。それは本当に一意の ID を生成する簡単な方法ですか?

マイクロ秒単位のタイムスタンプを生成するループを含む単一のスクリプトを実行している単一のユーザーがいると仮定しても、それが一意であるという理論的な保証は本当にありますか? そして実際には、可能性は完全に無視できるのでしょうか?

わかりやすくするために、ループはこれに過ぎないとします。

foreach($things as $thing){
    var_dump(microtime());
}

それが一意ではない可能性がある理論的な可能性はありますか?もしそうなら、実際にはどれほど現実的ですか?

4

2 に答える 2

13

マイクロ秒ベースの ID は、制限内で一意であることが保証されるだけです。この点では、1 台のコンピューターで 1 つのスレッド スクリプトを使用することは、おそらくかなり安全です。ただし、並列実行について話し始めるとすぐに、同じマシン内の複数の CPU または特に複数のマシンにまたがる複数の CPU で、すべての賭けがオフになります。

したがって、この ID を何に使用するかによって異なります。同じスクリプト内でのみ使用される ID を生成するために使用している場合は、おそらく十分に安全です。例えば:

<?php $randomId = uniqid(); ?>
<div id="<?php echo $randomId; ?>"></div>
<script>
    var div = document.getElementById('<?php echo $randomId; ?>');
    ...
</script>

この限られた用途では、おそらく問題に遭遇することはありません。

ただし、他の外部スクリプトと共有されている、または他のそのような用途を使用してファイル名の生成を開始する場合uniqid、私はそれに依存しません。ファイル名については、ファイルの内容に基づくハッシュを使用することをお勧めします。汎用の分散型ランダム生成 ID には、UUIDが適しています (この目的のために設計されているため)。

于 2014-11-12T09:05:28.973 に答える
2

そもそもなぜ uniqid が必要なのかを自問してください。たとえば、私のウェブサイトへのアップロードのファイル名として uniquid を使用しています。同時にアップロードするユーザーは何人でもいる可能性があるため、私が懸念しているのは、同じ ID を持つ 2 つ以上のファイルですが、1 人のユーザーが一度に 1 つのファイルしかアップロードできないことはわかっています。そのため、ユーザー名を先頭に追加し、常に一意性を維持します。

echo uniqid('username-'); // username-5621e3335ac0c

もちろん、最初に uniquid を使用する必要があるかどうかを常に自問する必要があります。ID を作成する理由が x 秒、分などごとにしか発生しないことがわかっている場合は、 time を使用するのと同じ方法で ID を作成できます。

echo 'username-'.time(); // username-1445062025
于 2015-10-17T06:14:57.493 に答える