質問
シンプルで短命の予約システムを作成したいのですが、確認番号を生成したい
- ユニーク
- ランダムに見える
- 英数字
- short-ish、少なくともsha1によって返される32文字の文字列よりはるかに短い
500件までの予約を希望しているため、衝突の可能性が高いとは思いません 。
1つのアイデアは、日付時刻スタンプとユーザー名に基づいてsha1ハッシュを生成し、最初の10文字に切り捨てることです。そのようなものは、500件までの予約を処理するのに十分な信頼性のある一意でしょうか?
解決
SHA-1ハッシュの任意のビットのランダム性に違いはないはずなので、それは可能です。もう1つの方法は、XORを使用して60ビットのデータが得られるまでハッシュをそれ自体に折りたたんで、 Base 64 を使用して、主に英数字の結果を取得します。
これは、同じ入力データに対して同じIDを繰り返し生成できるようにする場合にのみ必要です。それ以外の場合、一度生成したランダムなIDを使用し、その後保持する場合は、Andersの提案を使用します。競合が発生した場合は、別の競合を生成してください。
他のヒント
どんなものでも、プレーンな乱数ジェネレーターでも使用できます。ただし、予約コードがまだ存在していないことを確認する必要があります。この場合、新しいrandom / sha1 / etcが取得されるまで、文字列(date + user)に文字( 'x')を追加します。
私は〜500件の予約のみを希望しているため、衝突の可能性が高いとは思いません。
別の馬鹿げたアイデア:目的のプロパティを持つ1000または2000の一意の乱数を生成し、それらをどこかに保存し、登録時にユーザーに割り当てます:)
Perlでそれを行う1つの方法:
sub get_random_name() { my @chars=('a'..'z','A'..'Z'); my $random_string;foreach (1..22) { # rand @chars will generate a random # number between 0 and scalar @chars $random_string .= $chars[rand @chars]; } return $random_string . "-" . time(); }
time()部分の長さは覚えていないので、長さに合わせて数値を調整する必要があります。不要な部分は削除することもできます。
実際に500個だけの場合、20,000個をテーブルに事前生成してから、<!> quot; next used one <!> quot;を取得します。必要なときに。
この質問に関するヒント: C ++でランダムな英数字文字列を作成するにはどうすればよいですか
<!> quot; 1 <!> quot;、<!> quot; l <!> quot ;、および<!> quot; O <!> quot;、<!>などの文字を含めることは避けたいquot; 0 <!> quot;および<!> quot; 5 <!> quot;、<!> quot; S <!> quot ;、および<!> quot; Z <!> quot;、<!> quot; 2 <!> quot;お客様の電話で予約コードを読む必要がある場合に、お客様が文字列で簡単に使用できるようにします。そのリンクで提示されているアルゴリズムは、これを行うのに役立ちます。
ガイドを使用しますか? 16文字。ただし、実際に衝突を気にしない場合は、最初のn文字を選択できます。