web-dev-qa-db-ja.com

Laravel str_random()またはカスタム関数?

Laravel str_random()関数はIDに使用できるほど十分にランダムですか?

例えば:

str_random(32);

これにより、英数字[a-zA-z0-9](合計62文字)で構成される長さ32のランダムな文字列が生成されます。

これは、2272657884496751345355241563627544170162852933518655225856の可能性に相当します。

しかし、私の質問は、これで十分でしょうか?または、UUIDまたは別のカスタム関数の使用を検討する必要があります。

35
Mike

_str_random_(Str::random())は_openssl_random_pseudo_bytes_を使用しようとします。これは、一意性ではなく、暗号化用に最適化された擬似乱数ジェネレータです。 _openssl_random_pseudo_bytes_が利用できない場合、quickRandom()にフォールバックします。

_public static function quickRandom($length = 16)
{
    $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

    return substr(str_shuffle(str_repeat($pool, 5)), 0, $length);
}
_

私の意見では、quickRandomコードは一意性も暗号化も信頼できません

はい、_openssl_random_pseudo_bytes_を持ち、32バイトを使用することは、衝突を確認することはほとんど不可能ですが、それでも可能です。文字列/数値が一意(99.99%)になるようにしたい場合は、UUID関数を使用することをお勧めします。これは私が通常使用するものです:

_/**
 * 
 * Generate v4 UUID
 * 
 * Version 4 UUIDs are pseudo-random.
 */
public static function v4() 
{
    return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',

    // 32 bits for "time_low"
    mt_Rand(0, 0xffff), mt_Rand(0, 0xffff),

    // 16 bits for "time_mid"
    mt_Rand(0, 0xffff),

    // 16 bits for "time_hi_and_version",
    // four most significant bits holds version number 4
    mt_Rand(0, 0x0fff) | 0x4000,

    // 16 bits, 8 bits for "clk_seq_hi_res",
    // 8 bits for "clk_seq_low",
    // two most significant bits holds zero and one for variant DCE1.1
    mt_Rand(0, 0x3fff) | 0x8000,

    // 48 bits for "node"
    mt_Rand(0, 0xffff), mt_Rand(0, 0xffff), mt_Rand(0, 0xffff)
    );
}
_

有効なRFC 4211準拠バージョン4 UUIDを生成します。

これを確認してください: http://en.wikipedia.org/wiki/UUID#Random%5FUUID%5Fprobability%5Fof%5Fduplicates

this packageを使用できます。

例えば:

Uuid::generate()
1
hosein azimi