web-dev-qa-db-fra.com

Laravel str_random () ou fonction personnalisée?

La fonction Laravel str_random () est-elle suffisamment aléatoire pour que je puisse l'utiliser pour les identifiants?

Par exemple:

str_random(32);

Cela produit une chaîne aléatoire de longueur 32 composée de caractères alphanumériques [a-zA-z0-9] (62 caractères au total).

Ce qui équivaut à 2272657884496751345355241563627544170162852933518655225856 possibilités.

Cependant, ma question est, est-ce que ça va être assez bon? Ou devrais-je envisager d'utiliser des UUID ou une autre fonction personnalisée.

35
Mike

str_random (Str::random()) essaie d'utiliser openssl_random_pseudo_bytes Qui est un générateur de nombres pseudo aléatoires optimisé pour la cryptographie, pas l'unicité. Si openssl_random_pseudo_bytes N'est pas disponible, il revient à quickRandom():

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

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

À mon avis, le code quickRandom n'est pas fiable pour l'unicité ni la cryptographie.

Oui, avoir openssl_random_pseudo_bytes Et utiliser 32 octets est presque impossible de voir une collision, mais c'est toujours possible. Si vous voulez vous assurer que vos chaînes/numéros seront uniques (99,99%), vous feriez mieux d'utiliser une fonction UUID. C'est ce que j'utilise normalement:

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

Il génère un UUID VALID RFC 4211 COMPLIANT version 4.

Vérifiez ceci: http://en.wikipedia.org/wiki/UUID#Random%5FUUID%5Fprobability%5Fof%5Fduplicates

55

Vous pouvez utiliser le package this .

Par exemple:

Uuid::generate()
1
hosein azimi