2017-06-08 2 views
0

次の関数は、複数回呼び出された場合の出力/衝突の重複を防ぐ最良の方法をランダムな文字列出力にします。複数回呼び出されたときに出力が重複するのを防ぐPHPランダム文字列関数

function random_string($length) { 
      $key = ''; 
      $keys = array_merge(range('A', 'Z'), range('a', 'z'), array('_')); 

      for ($i = 0; $i < $length; $i++) { 
       $key .= $keys[array_rand($keys)]; 
      } 

      return $key; 
     } 
echo "First : " . random_string(rand(3, 50)); 
//These have a small percentage of a chance of matching the previous random output lets eliminate all possibility of getting the same output. 
echo "Second : " . random_string(rand(3, 50)); 
echo "Third : " . random_string(rand(3, 50)); 
echo "Fourth : " . random_string(rand(3, 50)); 

私はarray_uniqueは私が望むものを達成できるが、それは最善の解決策になるか、より効率的な方法があるでしょうPHPのドキュメントに読みになりました。あなたは名前さえないものを修正しようと、「overengeneering土地」に向かっている

// array to store required strings 
$stringsCollection = []; 
// 4 is the number of strings that you need 
while (sizeof($stringsCollection) != 4) { 
    // generate new string 
    $randString = random_string($length); 
    // if string is not in `stringsCollection` - add it as a key 
    if (!isset($stringsCollection[$randString])) { 
     $stringsCollection[$randString] = 1; 
    } 
} 
print_r(array_keys($stringsCollection)); 
+0

'Array_unique'独自の要素を排除するので、4つの文字列の代わりに、3つまたは2つまたは1つを取得します。 –

+2

以前に作成されたすべての文字列をコレクションおよびループに保存します。これは、メソッドがまだ含まれていない文字列を作成するまで続きます。 – Marvin

答えて

2

は簡単なソリューションですそれは遅いですか?鈍い?その後、関連する部品をプロファイルして修正します。 「効率的」とは、効率性を定義することなく定義された流行語です。

まず複数回呼び出された場合、私のような入力として(すなわち秒またはミリ秒)、詳細なタイムスタンプ+いくつかのmt_randと機能をハッシュ使用したい重複した出力/衝突を防ぐための最善の方法は何か

代わりに。長さは限られていますが、複数回呼び出して結果を連結することができます(必要に応じてトリミング)。値が1000%になりたい場合は、値が返されることはありませんでしたが、あなたはそれらを追跡する必要があります。と入力文字列を長く入力すると起こりません。

1

かあり、より効率的な方法

:):

関連する問題