3

一意の ID を生成するには、php で uniqid 関数を使用する必要があると思います。
ただし、uniqid はデフォルトで 13 桁の HEXA 番号を生成します。

4f66835b507db

この数値を 7 桁の NUMERIC 数値に減らしたいのですが、単一性を維持したいと考えています。出来ますか ?

4974012  

この番号は、ユーザー ID として使用されます。認証は、この ID とパスワードを使用して行われます。

uniqid は一意ではないと言う人もいます。それは悪い選択ですか?

4

6 に答える 6

5

十分なレコードを生成した後、「一意の」番号は最終的に衝突します。一意性を確保するには、生成した値をデータベースに保存する必要があり、次の値を生成するときに、衝突がないかどうかを確認する必要があります。

ただし、実際には、アプリケーションは通常、単純なシーケンス 1、2、3、... として ID を生成します。これにより、データ型がなくなるまで衝突が発生しないことがわかります (UINT は通常 32 ビット長であり、 40 億の一意の ID)。

于 2012-04-27T12:37:05.030 に答える
4

Uniqidは、完全な長さであっても一意であるとは限りません。

さらに、uniqid はローカルでのみ一意であることを意図しています。これは、2 つ以上のサーバーで同時にユーザーを作成すると、フルレングスの uniqid を使用したとしても、2 人の異なるユーザーに対して 1 つの ID になる可能性があることを意味します。

私の推奨事項:

  • グローバルに一意の識別子を本当に探している場合(つまり、アプリケーションが別々のデータベースを持つ複数のサーバーで実行されている場合)、UUIDを使用する必要があります。これらは uniqid によって返されるものよりもさらに長くなりますが、実際には衝突の可能性はありません。

  • ローカルで一意の識別子のみが必要な場合は、データベースで AUTO_INCREMENT を使用してください。これは、データベースに短いランダム ID が既に存在するかどうかを確認するよりも (少し) 高速で (少し) 安全です。

編集:以下のコメントでわかるように、ユーザーの ID だけでなく、ランダムなログイン名をユーザーに提供することを余儀なくされています...これは奇妙ですが、問題ありません。このような場合、randデータベースに存在しないものを取得するまで、ループで使用しようとすることがあります。

擬似コード:

$min = 1;
do {
    $username = "user" . rand($min, $min * 10);
    $min = $min * 10;
} while (user_exists($username));
// Create your user here.
于 2012-04-27T12:53:21.920 に答える
1

必要な長さのランダムな文字と数字を生成する while ループを作成し、まだ使用されていない ID を作成するまでループします。

于 2012-04-27T12:37:28.577 に答える
0

データベースを使用している場合。id列をuniqueととして定義してからauto-incremented、データベースにIDを管理させます。

より安全です。

続きを読む:mysql-doc

于 2012-04-27T12:45:28.193 に答える
0

それを 7 文字で数字だけに減らすことで、「一意性」を大幅に減らすことができます。

ユーザー ID の自動インクリメントを使用し、7 桁にする必要がある場合は 1000000 から始めることをお勧めします。

自動インクリメントなしで生成する必要がある場合は、mt_rand()7 桁の乱数を生成するために使用できます。

$random = mt_rand(1000000, 9999999);

番号が別のユーザーによって既に使用されているかどうかを確認する必要があるため、これは理想的ではありません。

于 2012-04-27T12:39:43.887 に答える