8

シンプルな短期間の予約システムを作成しようとしており、確認番号を生成したいと考えています。

  • 個性的
  • ランダムに見える
  • 英数字
  • 少なくとも sha1 によって返される 32 文字の長さの文字列よりもはるかに短い

私は 500 件までの予約しか考えていないので、衝突の可能性が高いとは考えていません。

私が思いついたアイデアの 1 つは、日時スタンプとユーザー名に基づいて sha1 ハッシュを生成し、それを最初の 10 文字に切り詰めることです。〜500件の予約を処理する目的で、そのようなものは確実に一意でしょうか?

4

7 に答える 7

4

SHA-1 ハッシュの特定のビットのランダム性に違いはないはずなので、それは可能です。別の方法として、XOR を使用して 60 ビットのデータになるまでハッシュを折りたたんでから、Base 64を使用してエンコードし、ほとんどが英数字の結果を取得する方法があります。

これは、同じ入力データに対して同じ Id を繰り返し生成できるようにする場合にのみ必要です。それ以外の場合、一度生成してその後保持するランダムIDの場合は、アンダースの提案を使用してください。競合が発生した場合は、別の競合を生成してください。

于 2009-01-21T23:14:46.883 に答える
3

単純な乱数ジェネレーターであっても、何でも使用できます。ただし、予約コードがまだ存在していないことを確認する必要があります。この場合、新しい random/sha1/etc を取得するまで、文字 ('x') を文字列 (date+user) に追加します。

私は 500 件までの予約しか考えていないので、衝突の可能性が高いとは考えていません。

別のばかげたアイデア: 1000 個または 2000 個の一意の乱数を目的のプロパティで生成し、それらをどこかに保存し、登録時にユーザーに割り当てます:)

于 2009-01-21T23:19:50.667 に答える
2

本当に 500 個しかない場合は、20,000 個をテーブルに事前に生成し、必要なときに「次の未使用のもの」を取得します。

于 2009-01-22T00:26:04.947 に答える
2

これを Perl で行う 1 つの方法を次に示します。

サブ get_random_name()
{
  私の @chars=('a'..'z','A'..'Z');
  私の $random_string;

foreach (1..22) { # rand @chars は乱数を生成します # 0 からスカラー @chars までの数値 $random_string .= $chars[rand @chars]; } $random_string を返します。"-" . 時間(); }

time() 部分の長さを覚えていないので、長さに合わせて数字を調整する必要があるかもしれません。不要な場合は、その部分を削除することもできます。

于 2009-01-21T23:14:30.660 に答える
1

この質問に関するヒント: C++ でランダムな英数字の文字列を作成するにはどうすればよいですか?

「1」、「l」、「O」、「0」、「5」、「S」、「Z」、「2」などの文字を文字列に含めないでください。電話で予約コードを読み取る必要がある場合。そのリンクに示されているアルゴリズムは、これを行うのに役立ちます。

于 2009-01-22T00:15:42.767 に答える
0

GUIDを使用しますか?16文字ですが、衝突を気にしない場合は、最初のn文字を選択するだけです。

于 2009-01-21T23:54:24.277 に答える
0

C# では、 http://www.dotnetfunda.com/forums/thread1357-how-do-generate-unique-alpha-numeric-random-number-in-aspnet.aspxを使用できます(非常に簡単な方法だと彼らは言います)。

于 2010-02-04T13:01:20.673 に答える