1

この次の関数は常に一意の文字列を生成しますか?次の関数から生成される文字列の長さの範囲はどのくらいですか?より独自性を生み出すために改善できますか?

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

ありがとう

4

3 に答える 3

4

一般に、独自のランダム/一意の関数を作成することはお勧めできません。KingCrunchが述べたように、PHPにはあなたが望むことを正確に実行する組み込み関数uniqidがありました。

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

この関数は常に一意の文字列を生成するとは限らないため、生成することはできません。ただし、優れた機能により、それは非常に起こりにくく(宝くじに当選するよりも数倍小さい)、したがって実際には十分にユニークです。

長さ:

  • mt_rand(10,99):[10,99](2桁)の範囲の数値を生成します
  • intval(microtime(true)* 100)は、現在のUNIXタイムスタンプに2桁のミリ秒を加えたものを取得します。タイムスタンプは(現時点では)10桁の長さであるため(約1世紀はそのままです)、合計桁数は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);

それはあなたが自分で思いつくことができるどんな機能よりも優れているでしょう。[/編集]

于 2011-06-28T06:40:00.410 に答える
1

簡単に使用できるuniqid()の優れた組み込み関数。これにより、タイムスタンプから一意のIDも生成されます。したがって、No。は常に一意になります。

于 2011-06-28T08:13:38.710 に答える
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;
}

幸運を!

于 2011-06-28T07:47:12.373 に答える