2011-06-28 10 views
1

この次の関数は、常に一意の文字列を生成しますか?次の関数から生成される文字列の長さの範囲はどのくらいでしょうか?より一意になるように改善することはできますか?PHP:この関数は常に一意の文字列を生成しますか?

base_convert(mt_rand(10, 99) . intval(microtime(true) * 100), 8, 36); 

おかげ

+4

'uniqid()'について – KingCrunch

+0

あなたはTIAS –

+0

@ KingCrunch私は特定の長さが必要です。最大6文字。 – sunjie

答えて

4

は、あなた自身のランダム/独自の関数を作成することが一般的に悪い考えであることに留意してください。 KingCrunchのように、PHPには組み込み関数uniqidがあり、それはあなたが望むものを正確に実行します。

は、あなたの質問に答えるために:

関数は常にユニークな文字列を生成しませんが、そうすることは不可能です。しかし、良い機能は非常に(宝くじに勝つよりも小さい倍の大きさ)、したがって実際には十分にユニークです。

長さ:

  • mt_rand(10,99)の範囲内の数 を生成する[10,99](2桁)
  • INTVAL(微小時間(真)* 100) を取得します現在のunixタイムスタンプ+ 2のミリ秒の数字。タイムスタンプは(現時点では)10桁の長さ(約世紀のためにそう残る)ので、桁数の合計は12(10進数)の数字

あるそれからbase_8番号このように番号を扱いbase_8は番号8または9を知らないので、しばしば失敗します。この場合のPHPの正確な動作はわかりませんが、それでもやはり無効です。数字が基数10として扱われる場合、10^13(mt_randが10を生成する場合)と10^14(mt_randが99を生成する場合)の数字を表すためには、どのくらいの数字(基数36) )。

base_36の9桁が必要な最小の数字は、2,821,109,907,457で、数字の下限よりも小さい数字です。しかし、9桁で表現できる最大の数字は101,559,956,668,416(〜10^14)です。したがって、9桁のbase_36番号が生成されます。

[編集] 特に6文字のユニークな文字列が必要であることがわかりました。 6文字は比較的短く、一意性を保証するのは難しいことに注意してください。あなたの最善の策はまだ

substr(uniqid(), 0, 6); 

それはあなたとあなた自身の上に来るように管理する任意の関数よりも良くなるだろう。[/編集]

+0

詳細な返信をありがとうございます。私は最大の一意性を持つ最大6文字の英数字文字列を生成したいと思っています。何か解決策を提案できますか? – sunjie

+1

これは、uniqid()を使用すると非常に悪い示唆です。基本的にuniqid()は、microtime()をより小さな文字列(単純な基本変換)に変換します。たとえば、最初の5文字は1時間で変わらないので、substr(uniqid()、0、6)は長い間同じ文字列を生成します(必ずしも一意ではありません)。第2に、完全なuniqid()文字列を使用すると、値が非常に予測できるように、いくつかの攻撃に対して脆弱になります:http://en.wikipedia.org/wiki/Random_number_generator_attackしかし、セキュリティについて心配していないなら、substr(uniqid()、 - 6)を使うことができます。 – XzKto

0

あなたの質問への答えはあなたの条件によって異なります。私はこの機能を安全ではない一般的な要件に使用します。アルファベットと数字だけが返され、「類似した」文字がクリアされます: -

function fGetRandomString($vLength = 4) { 
    $sRandomString = ""; $sChr = ""; 
    for ($i = 0 ; $i < $vLength ; $i++) { 
     $vState = rand(1, 3); 
      switch ($vState) { 
      case 1: $sChr = chr(rand(65, 90)); break; // CAPS (A-Z) 
      case 2: $sChr = chr(rand(97, 122)); break; // small (a-z) 
      case 3: $sChr = chr(rand(48, 57)); break; // Numbers (0-9) 
     } 
     if (!in_array($sChr, array('O', 'o', '0', '1', 'l'))) $sRandomString .= $sChr; 
     else $i--; 
    } 
    return $sRandomString; 
} 

Good Luck!

1

単純な使い方uniqid()good組み込み関数。これは、タイムスタンプから一意のIDも生成します。だから、ナンバーは常にユニークなものになるだろう

関連する問題