重複の可能性を最小限に抑える一意のIDを生成する方法は何ですか?
for(let i = 0; i < <Arbitrary Limit>; i++)
generateID();
現在の解決策はいくつかありますが、それらはすべて問題を解決するための回り道です。
考えられる解決策1:データベースを使用して新しいIDを生成します。フロントエンドでこれを実行したいので、これは私には機能しません。
考えられる解決策2:Math.random()* Math.floor(LIMIT)を使用します。ここで、LIMITは数値です。オーバーラップの可能性を最小限に抑えるには大きな制限が必要であり、したがって大量のIDが必要になるため、これは機能しません。IDを必要とする数十万のインスタンスを操作する場合、チャンスは大幅に増加します。
考えられる解決策3:
'_' + Math.random().toString(36).substr(2, 9);
これはほぼ機能しますが、Math.random()は疑似ランダムだと思います。
考えられる解決策4:Date.now()。Date.getTime()など。[Date.now()、Date.now()]を生成すると同じIDが発生するため、これは機能しません。重複を最小限に抑えるために、おそらく長いIDも必要です。
同じIDを生成する可能性が絶対に0%である必要はありません。次のことを行わずに、可能性を可能な限り最小限に抑えたいと考えています。
これはできればscalabeである必要があります。これは、10または1000000のIDで機能するはずです。
編集:ローカルで生成され、フロントエンドのユーザー間で通信する必要のない一意のID。例:コンポーネントは同じクラスの多くのインスタンスをレンダリングする必要があり、それに割り当てるためのキーが必要です。キーは異なっている必要があり、コンポーネントをアンマウントすると、生成されたキー/インスタンスが削除されます。
バックエンドにまったく依存したり「カウントを保存」したりせずに、完全にフロントエンドで一意のIDを生成したいようです。次に、ソリューションは、アプリケーションの存続期間中にアプリケーションのフロントエンドにアクセスすると予想されるさまざまなユーザーの数に一部依存し、IDのサイズは、衝突のリスクを許容できる程度に依存します(IDを生成していると仮定)無作為に); そのためには、誕生日の問題を参照してください。
次に、選択したIDのサイズに応じて、crypto.randomBytes
「真の」ランダムIDに最も近い暗号化RNG(関数など)を使用してランダムにIDを生成します。
一方、フロントエンドにアクセスするユーザーが少なくても、各ユーザーが多数の一意のIDを生成する場合は、中央データベースから各ユーザーに一意の値を割り当てることができます。これは、各フロントエンドコンピューターがその一意の値を次のように使用できるためです。生成する一意の識別子の一部であり、他のコンピューターや中央データベースにさらに接続することなく、アプリケーション全体で識別子が一意であることを確認します。
他にも考慮事項があることに注意してください。IDを知っているだけで(ログインしたり、何らかの方法で承認されていなくても)IDが識別するリソースに誰でもアクセスできるかどうかも検討する必要があります。そうでない場合は、追加のアクセス制御が必要になります。
目的に応じて、シーケンシャルIDを適用してみてください。シーケンシャルIDだけでは不十分な場合は、シーケンシャルIDに可逆操作を適用してみてください。この操作の一例は、次のページで説明するような、技術的には「2モジュラスの累乗の線形合同法」と呼ばれます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加