パスワードやユーザー ID などではなく、一意の値を生成する方法は 3 つしかありません。
- 効果的な GUID ジェネレーターを使用してください。これらは長く、縮小できません。一部のみを使用する場合は、失敗します。
- 数値の少なくとも一部は、単一のシーケンスから順次生成されます。綿毛またはエンコーディングを追加して、シーケンシャルに見えないようにすることができます。利点は、すぐに開始できることです。欠点は、単一のソースが必要なことです。単一ソースの制限に対する回避策は、ソースに番号を付けることです。そのため、[source #] + [seq #] を含めると、各ソースが独自のシーケンスを生成できます。
- 他の方法でそれらを生成し、以前に生成された値の単一の履歴と照合します。
他の方法は保証されません。基本的には 2 進数を生成していますが (これはコンピューターです)、16 進数、10 進数、Base64、または単語リストでエンコードできます。用途に合ったエンコーディングを選択してください。通常、ユーザーが入力したデータには、Base32 のバリエーションが必要です (これはヒントです)。
GUIDS についての注意: それらは、その長さとそれらを生成するために使用される方法から独自性の強さを獲得します。 128 ビット未満のものは安全ではありません。 乱数の生成以外にも、GUID をより一意にする特性があります。それらは実質的に唯一のものであり、完全に唯一のものではないことに注意してください。可能ですが、重複することは事実上不可能です。
GUIDS に関する更新された注意: これを書いてから、多くの GUID ジェネレーターが暗号的に安全な乱数ジェネレーターを使用していることを知りました (次に生成される数値を予測するのは困難または不可能であり、繰り返す可能性は低いです)。実際には 5 つの異なるUUID アルゴリズムがあります。アルゴリズム 4 は、現在 Microsoft が Windows GUID 生成 API に使用しているものです。GUIDは、Microsoft による UUID 標準の実装です。
更新: 7 ~ 16 文字が必要な場合は、方法 2 または 3 を使用する必要があります。
結論: 率直に言って、完全にユニークなものはありません。シーケンシャル ジェネレーターを使用したとしても、最終的には宇宙のすべてのアトムを使用してストレージを使い果たし、自分自身にループバックして繰り返します。あなたの唯一の希望は、その点に到達する前に宇宙の熱死です.
最高の乱数ジェネレーターでさえ、生成している乱数の合計サイズに等しい回数を繰り返す可能性があります。たとえば、四半期を取ります。これは完全にランダムなビット ジェネレーターであり、繰り返される確率は 2 分の 1 です。
したがって、すべてはあなたの独自性の限界にかかっています。1,099,511,627,776 の数値を 8 桁で 100% 一意にするには、シーケンスを使用してから base32 でエンコードします。過去の数字のリストと照合しない他の方法では、一意ではない可能性が n/1,099,511,627,776 (n = 以前に生成された数字の数) に等しいだけです。