web-dev-qa-db-ja.com

PHP)で4〜8文字のランダムな文字列を生成します

PHPを使用して文字列を生成する必要があります。needであるuniqueおよびneedである4〜8文字(変数の値)。

Crc32ハッシュを使用できると思いましたが、文字数を決定できませんが、一意になることは確かです。一方、「パスワードジェネレータ」を作成するだけで重複した文字列が生成され、各文字列のテーブルの値を確認するには時間がかかります。

どうやってやるの?

ありがとう!


多分私はそれを使うことができます:

  function unique_id(){
  $better_token = md5(uniqid(Rand(), true));
  $unique_code = substr($better_token, 16);
  $uniqueid = $unique_code;
  return $uniqueid;
  }

  $id = unique_id();

に変更:

  function unique_id($l = 8){
  $better_token = md5(uniqid(Rand(), true));
      $rem = strlen($better_token)-$l;
  $unique_code = substr($better_token, 0, -$rem);
  $uniqueid = $unique_code;
  return $uniqueid;
  }

  echo unique_id(4);

しばらくの間、毎回ユニークな弦を手に入れると思いますか?

17
Jeremy Dicaire

要するに、かなり良いランダム値が得られると思います。衝突の可能性は常にありますが、ランダムな値を取得するためにできることはすべて実行しました。 uniqid()は、マイクロ秒単位の現在の時刻に基づいてランダムな値を返します。 Rand()(mt_Rand()の方が良い)と2番目の引数をuniqid()にtrueとして指定すると、値がさらに一意になります。 md5()を使用して値をハッシュすると、生成された2つのランダムな値のわずかな違いでもハッシュ関数によって拡大されるため、かなり一意になります。理想的なマシンは、短い値よりも長い値の方が衝突する可能性が低いという点で正しいです。

Md5()は常に32文字の長さの文字列を返すため、関数を短くすることもできます。これを試して:

function unique_id($l = 8) {
    return substr(md5(uniqid(mt_Rand(), true)), 0, $l);
}
49
Jeremy

ランダム性の問題は、何も確信できないことです。今回は1つの番号を取得し、次は同じ番号を取得できる可能性がわずかにあります。そうは言っても、その確率を減らすために、文字列をできるだけ長くしたいと思うでしょう。このような数値の長さの例として、 GUID(グローバル一意識別子) は16バイトの長さです。

理論的には、4つの16進文字(16ビット)は16 ^ 4 = 65536の可能性しか与えませんが、8つの16進文字(32ビット)は16 ^ 8 = 4294967296を与えます。ただし、の可能性を考慮する必要があります。 any衝突する2つのハッシュ(「誕生日の問題」)。ウィキペディアには、そのような衝突の可能性について 良い表 があります。つまり、4つの16進文字では間違いなく十分ではなく、8つでは不十分な場合があります。

16進数ではなくBase64エンコーディングの使用を検討することをお勧めします。そうすれば、32ビットだけでなく48ビットを収めることができます。

8バイトは8 * 8 = 64ビットです。

3
PleaseStand

信頼できるパスワードascii文字a-zA-Zおよび番号0〜9からのみ作成できます。その最善の方法は、PHP7のrandom_int()random_bytes()などの暗号的に安全なメソッドのみを使用することです。残りの関数はbase64_encode()としてのみ使用でき、文字列の信頼性を高めて[〜#〜] ascii [〜#に変更するためのサポート関数としてのみ使用できます。 〜]文字。

mt_Rand()は安全ではなく、非常に古いものです。任意の文字列からrandom_int()を使用する必要があります。バイナリ文字列から base64_encode() を使用して、バイナリ文字列を信頼できるものにするか、bin2hexにする必要がありますが、バイトを16桁(値)にのみカットします。 この関数の私の実装を参照してください。

0