私はこれを使用することを検討しています:http://phpgoogle.blogspot.com/2007/08/four-ways-to-generate-unique-id-by-php.html
私の考えは2と3の混合を使用することです。しかし、私の質問は、可能性は低いですが、結果を5文字だけにサブストリングすると、同じ注文番号の2つの注文が生成される可能性があるということです。長さ?3はどうですか?2?1?確かに1の場合、IDが同じになる可能性は1 /(26 + 10)ありますか?
私はこれを使用することを検討しています:http://phpgoogle.blogspot.com/2007/08/four-ways-to-generate-unique-id-by-php.html
私の考えは2と3の混合を使用することです。しかし、私の質問は、可能性は低いですが、結果を5文字だけにサブストリングすると、同じ注文番号の2つの注文が生成される可能性があるということです。長さ?3はどうですか?2?1?確かに1の場合、IDが同じになる可能性は1 /(26 + 10)ありますか?
ユーザーが認証され、ユーザーIDを持っていると仮定します。
$unique_id = time() . mt_rand() . $userid;
同じユーザーが同じ秒内にこのページを2回要求した場合でも、1 inの可能性がmt_getrandmax()
あり、私のマシンでは2147483647を返します。おそらくそれで生きることができますか?
ユーザーが認証されていない場合は、必要に応じて代わりにユーザーのIPアドレスのハッシュを使用できます。
なぜ一意のIDが必要なのですか?
DBで一意のIDを生成する場合は、自動インクリメントを使用してDBに任せます。
とにかく、microtime()とrand()の組み合わせを使用できます。あなたはかなりユニークです。
OPのコメントに関連して編集:
もしそうなら、あなたは「常にユニーク」を持つことはできません。または、その方法を見つければ、チューリング賞を受賞します。
さらに優れた数学的アプローチでは、「はい、しかし15645736536475回に1回、私は困惑します」という味がします。
唯一の方法は、新しいIDが必要になるたびにインクリメントするカウンターを用意することです。それがDBのやり方です。挿入する前にIDが必要なのはなぜですか?
ランダムな文字列に依存している場合は、そうです。理論的には、2つのIDが同じになる可能性があります。そのため、長いランダムな文字列が使用され、その可能性が受け入れられないようになっています。確率は計算できます。たとえば、IDが現在の時刻(最も近い秒まで)とランダムな5文字の英数字の文字列で構成され、同じ秒に3つのIDが生成されるとすると、2つのオッズ(以上)同じである:1-(38 ^ 5!/(38 ^ 5-3)!/ 38 ^ 5 ^ 3)=3.79e-8。ほとんどの人は、そのようなオッズは実際のアプリケーションには十分に低くないことに同意するでしょう。そのため、リンク先のページでは代わりに10文字が提案されています。
セッションID、ユーザー名などをお持ちの場合は、注文IDでそれを使用して問題を解決できます。
PHPのuniqidのマンページから引用:
$better_token = md5(uniqid(mt_rand(), true));
md5
ただし、 -partを省略した方がよい場合があります(トークンの数を2 ^ 128に減らします)
データベースを使用している場合は、はい、DBMSにIDの生成を処理させる必要があります
microtimeとsha256ハッシュを使用することも、ハッシュなしで使用することもできます。
$generate_order_id = hash('sha256', microtime() );
データベースを使用している場合は、DBMSにIDの生成を処理させる必要があります。
あなたが自分でそれをやりたいのなら、方法があります...最高のものではありませんが、それは仕事を成し遂げます。
最初にdbから既存のすべてのuidを取得してから、dowhileループを作成します...
$uids_in_db = []; //<< get here the uids from id. Use array_flip so the uids to be the keys in the array ( because isset is faster than in_array )
do{
$uid = generate_somehow_a_random_uid();
} while ( isset( $uids_in_db[$uid]) );
そうすれば、uidが重複することはありません。重複する場合は、dowhileで新しいuidが作成されます。
注:このメソッドを使用することにより、dbに対して追加のクエリを実行し、ループ内で関数を使用する必要があるため、最速の方法ではありません...