4

重複の可能性:
PHP:ランダムで一意の英数字の文字列を生成する方法は?

一意のID(英数字の文字列)を生成しようとしています。そのために現在のタイムスタンプを使用しています。2つの質問があります:

  1. ifmd5(stamp1)とは異なります。md5(stamp2)stamp1 != stamp2
  2. 一意の文字列を生成する一般的な方法はありますか?

PS:原因の最も簡単な方法は、IDとしてスタンプを取ることです。それでも、idがどのように生成されるかを簡単に見つけることができたくありません

4

3 に答える 3

11
  1. はい、ほとんどの場合、それらは異なります。ハッシュ衝突の可能性は非常に低いです (10 億分の 1 と考えてください)。

  2. 組み込み関数uniqid()はこれに最適です。することもできますが、これは GUID のエントロピーを増加させないmd5(uniqid())ことに注意してください。エントロピーを増やすには、次のように関数を呼び出すことができます。uniqid('',TRUE);

于 2012-06-14T06:44:02.407 に答える
3

ハッシュ関数の使用は真に一意になることはありませんが、次のように、IPアドレスを取得してリクエストのマイクロタイムを追加するなど、はるかに近い別の文字列をまとめることができます。

$strUnique = sprintf('%u', ip2long($_SERVER['REMOTE_ADDR'])) . floor(microtime(true) * 1000);

これが一意でないためには、2人の訪問者がまったく同じマイクロ秒で同じIPアドレスからページをロードする必要があります。これは、2つのハッシュが等しい場合よりも可能性が低いです。

于 2012-06-14T07:45:22.427 に答える
2

xbonezの回答には完全に同意しますが、使用目的に応じて、他にいくつかの考慮事項があることを追加したいと思います。

  • これがデータベース ID の場合は、通常、データベース システムの自動インクリメントまたはその他の一意のキー関数を使用して ID を生成できます。
  • これがファイル名の場合は、代わりにtempnamを使用します
  • 複数のユーザーが同じタイムスタンプでページにアクセスする可能性が非常に高いため、md5 でタイムスタンプと乱数の両方を使用することをお勧めします。
于 2012-06-14T06:47:40.640 に答える