2

数字のみで構成される時間ベースの一意のIDを取得する必要があります。単純に次のようなものを使用することを考えていました:

str_replace(".", "", microtime(true))

microtimeコメントの投稿など、多くのことにこの ID を使用しますが、かなりのトラフィックが予想されるため、関数と衝突する可能性がどのくらい高いかを知りたいですか?

おそらく、数値の一意のIDを取得するより良い方法はありますか? 並べ替えができるように、時間に基づいている必要があることを覚えておいてください。

4

4 に答える 4

5

時間に基づく必要がある場合は、マイクロタイムを使用できます。しかし、あなたはデータベースに物を保存していると思うので、私の投票は、 type と defaultを持つprimary keyIdauto_increment、次に 2 番目の列に行きます。timestampcurrent time

次に、タイムスタンプで並べ替え、トラフィックが非常に多い場合でも 100% 一意の識別子を取得できます。ただし、注文が必要な場合 (日付間の検索ではないため)、時間に基づいて注文する必要はありません。

1, 2, 3, 4 は、マイクロタイム キーと同じ順序になり、はるかに大きく、さらに離れています。

アップデート

一意のキーである必要があり、データベースから使用できない場合は、次のことを試してください。重複キーの変更は非常にスリムであるため、無視できます。

$key = microtime() + floor(rand()*10000);
于 2012-12-18T11:48:51.940 に答える
0

純粋な時間ベースの ID を使用する必要がある場合は、衝突を回避する必要があるため、a) データベースで主キーを使用し、b) 再帰チェックを使用して、時間ベースの ID がまだ取得されていないことを確認します。

$id = getTimeId();

function getTimeId() {
    // Generate microtime
    // Query to ensure it does not exist
    // Return microtime
}

それを再帰的にする楽しみは、あなたに任せます。

于 2012-12-18T12:01:15.210 に答える
0

衝突を避ける必要がある場合、時間ベースは機能しません。最終的には衝突します。セマフォでカウンターを使用しないのはなぜですか。

http://php.net/manual/en/book.sem.php

于 2012-12-18T11:50:12.663 に答える