数か月前、私は Web アプリケーション用に一意でランダムなコードを実装する任務を負っていました。コードはユーザーフレンドリーでできるだけ小さくする必要がありますが、基本的にランダムである必要があります (ユーザーがシーケンスの次のコードを簡単に予測できないようにするため)。
最終的に、次のような値が生成されました。
Af3nT5Xf2
残念ながら、私は実装に満足することはありませんでした。Guid は問題外でした。ユーザーが入力するには大きすぎて難しかったのです。4 桁または 5 桁の文字/数字の行に沿って何かを期待していましたが、特定の実装では、エンコードした場合、著しくパターン化されたシーケンスが生成されます。 9 文字未満。
最終的に行ったことは次のとおりです。
データベースから一意の連続した 32 ビット ID を取得しました。次に、それを 64 ビット RANDOM 整数の中央ビットに挿入しました。簡単に入力および認識できる文字 (L、l、1、O、0 などの混同しやすい文字をスキップする AZ、az、2-9 など) のルックアップ テーブルを作成しました。最後に、そのルックアップ テーブルを使用して、64 ビット整数を base-54 エンコードしました。上位ビットはランダムで、下位ビットはランダムでしたが、中央のビットは連続していました。
最終結果は、GUID よりもはるかに小さく、ランダムに見えるコードでしたが、まったくそうではありませんでした。
この特定の実装に満足したことはありません。あなたたちはどうしたでしょう?