クライアントには、単純に増加する順序番号 (1、2、3...) があります。彼は、エンドユーザーが 8 桁または 9 桁 (数字のみ -- 文字なし) の「乱数」を受け取ることを望んでいます。明らかに、この「乱数」は実際には一意で可逆でなければなりません (これは実際には actualOrderNumber の暗号化です)。
私の最初の考えは、いくつかのビットをシャッフルすることでした。クライアントにサンプル シーケンスを見せたところ、「シャッフル」ポイント (下位ビットが機能するポイント) に達するまで、後続の obfuscOrderNumbers が増加していると不満を漏らしました。彼は、obfuscOrderNumbers ができるだけランダムに見えるようにしたいと考えています。
次に考えたのは、線形合同疑似乱数ジェネレーターを決定論的にシードしてから、actualOrderNumber 番目の値を取得することでした。しかし、その場合、衝突について心配する必要があります。クライアントは、少なくとも 10^7 サイクルで衝突しないことが保証されているアルゴリズムを必要としています。
私の 3 番目の考えは、「ああ、暗号化するだけだ」というものでしたが、ストック暗号化ライブラリを使用する場合は、8 桁または 9 桁のみの要件を取得するために後処理する必要があります。
私の 4 番目の考えは、actualOrderNumber のビットをグレイ コードの整数として解釈し、それを返すことでした。
私の 5 番目は、「私はおそらくこれを考えすぎています。StackOverflow の誰かが数行のコードでこれを実行できるに違いありません」でした。