1

いくつかのジェネレーター スクリプトで一意の番号を生成する必要がありますが、1 つの順序で生成することはできません。チケットを販売する必要があります。

たとえば、現在チケット番号は次のようになっています。

100000
100001
100002
...

そのため、ユーザーは販売数を確認できます。

一意の番号を生成するにはどうすればよいですか?

例えば:

151647
457561
752163
...

乱数ジェネレーターを使用できますが、そのような数が生成されていない場合は常にデータベースをチェックインしています。

うーん、おそらくその列でインデックスを使用している場合-チェックに時間がかかりません。

それでも、1 を追加したい場合は、最後のカード番号を取得する必要がありますが、最後に取得するのは十分に高速です。

そして、より多くのチケットが販売されるほど、RNG が既存の数を生成する可能性が高くなります。そのため、将来的にはより多くのチェックが行われる可能性があります。SO 最善の方法は、最後の番号を取得し、それによって次を生成することです。

4

5 に答える 5

3

チケット番号をスクランブルする簡単な方法を次に示します (注: 64 ビットの PHP が必要か、bcmathライブラリを使用するようにコードを変更してください)。

function scramble($number) {
    return (305914*($number-100000)+151647) % 999983;
}

ほら、出力はあなたの例のようにも見えます:

Input     Output
------    ------
100000    151647
100001    457561
100002    763475
100003    069406

必要に応じて元に戻すことができるので、これらのコードを URL で使用して元の番号を復元できます。

function unscramble($number) {
    return (605673*($number-151647)+100000) % 999983 ;
}

これは安全ですか?多くの連番にアクセスできる人はパターンを見つけることができるので、チケット番号が非常に機密である場合は使用しないでください。

于 2013-08-21T12:12:11.133 に答える
0
 function generateCode() {



    $chars = '01234567890';
    do {
            $code = '';
            for ($x = 0; $x < 6; $x++) {
                $code .= $chars[ rand(0, strlen($chars)-1) ];
            }

このコードが以前に生成された場合は、データベースでここを確認できます。そうであれば、戻ります。

  } while (true);

    return $code;

    }
于 2013-08-21T11:45:09.583 に答える
0

番号を生成してプールに保存し、新しい番号が必要な場合は、プールの RNG インデックスを使用して番号を取得し、プールから削除して返すことができます。

プールがほとんどなくなった場合は、別のバッチを生成するだけです

于 2013-08-21T11:38:49.650 に答える