最近、ユーザーがオンラインで利用できるギフトカードのようなバウチャーのコードに関するこの質問を投稿しました。私は、大きなキースペース、低い推測可能性、および人間の読みやすさの間の最良のトレードオフを見つけたかったのです。実装に取り掛かった今、私はまったく別の問題を抱えていることに気付きました。それは、よりアルゴリズム的な課題です。
簡単にするためにAからZまでの10文字など、いくつかのコード形式を採用し、バウチャーの生成を開始するとします。これを行うための正しいアルゴリズムは何ですか?!
私の最初のアプローチは、0から308,915,776までのすべての可能なコードに番号を付けてから、その範囲の乱数の生成を開始することです。ただし、これには明らかに大きな問題があります。以前に生成されたすべてのバウチャーコードに対して乱数を確認する必要があり、既存のバウチャーコードと衝突する場合は、コードを破棄して別のコードを試す必要があります。システムがより多くのデータを蓄積すると、速度が低下します。極端な場合、コードが1つしか残っていない場合、システムがそれを正しく推測することはほぼ不可能です。
すべてのコードを事前に生成してシャッフルしてから、順番に使用することができます。しかし、これは私が多くのコードを保存しなければならないことを意味し、実際、私のキースペースは私が説明したものよりも大きいので、非常に大量のデータについて話しています。したがって、それもあまり望ましくありません。
したがって、これにより、コードを順番に使用することになります。ただし、推測可能なバウチャーコードは必要ありません。バウチャー「AAAAAAAAAY」を購入したユーザーは、「AAAAAAAAAZ」と入力した場合、別の有効なコードを取得する可能性は高くありません。
アルファベットと位置をシャッフルして、代わりに
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'私が使用する
'LYFZTGKBNDRAPWEOXQHVJSUMIC'
位置の代わりに
9 8 7 6 5 4 3 210位置は
1 8 0 7 5 4 3 9 2 6
このロジックを使用して、コードを指定します
LNWHDTECMA
次のコードは
LNEHDTECMA
これは間違いなく推測しにくいです。しかし、それらはまだ互いに1文字しか離れておらず、これらのバウチャーのうち2つだけが与えられると、どの位置が増加しているかがわかり、24回以内の推測で次のコードを取得する可能性が90%になります。
私の「エスケープハッチ」は、これらすべてを捨ててGUIDを使用することです。ユーザーが入力する必要のある文字よりも多くの文字があり、I/1やO/0のような類似の文字が含まれていますが、魔法のように上記の頭痛の種をすべて解消します。それでも、私はこれについて考えるのを楽しんでいます、多分あなたもそうです。私はいくつかの代替案を聞きたいです。あなたはどれだけ持ってる?
ありがとう!