質問

シンプルで短命の予約システムを作成したいのですが、確認番号を生成したい

  • ユニーク
  • ランダムに見える
  • 英数字
  • 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文字を選択できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top