Подтвердить что ты не робот

Laravel str_random() или пользовательская функция?

Является ли функция str_random() Laravel достаточно случайной, чтобы я мог использовать ее для идентификаторов?

Например:

str_random(32);

Это создает случайную строку длиной 32, состоящую из буквенно-цифровых символов [a-zA-z0-9] (всего 62 символа).

Что соответствует 2272657884496751345355241563627544170162852933518655225856 возможностям.

Однако, мой вопрос: будет ли это достаточно хорошо? Или я должен использовать UUID или другую пользовательскую функцию.

4b9b3361

Ответ 1

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)
    );
}

Он генерирует VALID RFC 4211 COMPLIANT версии 4 UUID.

Проверьте это: http://en.wikipedia.org/wiki/UUID#Random%5FUUID%5Fprobability%5Fof%5Fduplicates