2

私はこれを使用することを検討しています: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)ありますか?

4

6 に答える 6

6

ユーザーが認証され、ユーザーIDを持っていると仮定します。

$unique_id = time() . mt_rand() . $userid;

同じユーザーが同じ秒内にこのページを2回要求した場合でも、1 inの可能性がmt_getrandmax()あり、私のマシンでは2147483647を返します。おそらくそれで生きることができますか?

ユーザーが認証されていない場合は、必要に応じて代わりにユーザーのIPアドレスのハッシュを使用できます。

于 2009-09-08T09:54:03.220 に答える
4

なぜ一意のIDが必要なのですか?

DBで一意のIDを生成する場合は、自動インクリメントを使用してDBに任せます。

とにかく、microtime()とrand()の組み合わせを使用できます。あなたはかなりユニークです。

OPのコメントに関連して編集:

もしそうなら、あなたは「常にユニーク」を持つことはできません。または、その方法を見つければ、チューリング賞を受賞します。

さらに優れた数学的アプローチでは、「はい、しかし15645736536475回に1回、私は困惑します」という味がします。

唯一の方法は、新しいIDが必要になるたびにインクリメントするカウンターを用意することです。それがDBのやり方です。挿入する前にIDが必要なのはなぜですか?

于 2009-09-08T09:30:01.303 に答える
3

ランダムな文字列に依存している場合は、そうです。理論的には、2つのIDが同じになる可能性があります。そのため、長いランダムな文字列が使用され、その可能性が受け入れられないようになっています。確率は計算できます。たとえば、IDが現在の時刻(最も近い秒まで)とランダムな5文字の英数字の文字列で構成され、同じ秒に3つのIDが生成されるとすると、2つのオッズ(以上)同じである:1-(38 ^ 5!/(38 ^ 5-3)!/ 38 ^ 5 ^ 3)=3.79e-8。ほとんどの人は、そのようなオッズは実際のアプリケーションには十分に低くないことに同意するでしょう。そのため、リンク先のページでは代わりに10文字が提案されています。

セッションID、ユーザー名などをお持ちの場合は、注文IDでそれを使用して問題を解決できます。

于 2009-09-08T10:04:44.573 に答える
1

PHPのuniqidのマンページから引用:

$better_token = md5(uniqid(mt_rand(), true));

md5ただし、 -partを省略した方がよい場合があります(トークンの数を2 ^ 128に減らします)

データベースを使用している場合は、はい、DBMSにIDの生成を処理させる必要があります

于 2009-09-08T09:36:07.487 に答える
1

microtimeとsha256ハッシュを使用することも、ハッシュなしで使用することもできます。

 $generate_order_id  = hash('sha256', microtime() );
于 2015-04-15T19:37:21.667 に答える
0

データベースを使用している場合は、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に対して追加のクエリを実行し、ループ内で関数を使用する必要があるため、最速の方法ではありません...

于 2019-10-19T18:48:05.163 に答える