2014-04-11 8 views
21

La funzione di Laravel str_random() è abbastanza casuale da poter essere utilizzata per gli ID?Laravel str_random() o funzione personalizzata?

Ad esempio:

str_random(32); 

Questo produce una stringa casuale di lunghezza 32 costituita da caratteri alfanumerici [A-Za-z0-9] (62 caratteri in totale).

Che corrisponde a 2272657884496751345355241563627544170162852933518655225856 possibilità.

Tuttavia, la mia domanda è, questo sarà abbastanza buono? O dovrei considerare l'utilizzo di UUID o un'altra funzione personalizzata.

+0

Si può sempre controllare per assicurarsi che non è un duplicato prima di salvarlo, come quando la generazione di lumache unici. Certo, è molto improbabile che ciò accada. – BenjaminRH

risposta

41

str_random (Str::random()) tenta di utilizzare openssl_random_pseudo_bytes che è un generatore di numeri pseudo casuali ottimizzato per la crittografia, non l'unicità. Se openssl_random_pseudo_bytes non è disponibile, cade di nuovo a quickRandom():

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

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

A mio parere quickRandom codice non è affidabile per l'unicità, né la crittografia.

Sì, avere openssl_random_pseudo_bytes e utilizzare 32 byte è quasi impossibile vedere una collisione, ma è ancora possibile. Se vuoi assicurarti che le tue stringhe/numeri siano univoci (99,99%), è meglio usare una funzione UUID. Questo è quello che uso normalmente:

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

genera una valida RFC 4211 versione CONFORME 4 UUID.

Controllare questo: http://en.wikipedia.org/wiki/UUID#Random%5FUUID%5Fprobability%5Fof%5Fduplicates

+0

Dove dichiari "se è disponibile" rispetto a openssl, perché non dovrebbe essere? Inoltre, qual è il metodo migliore per l'univocità poiché userò le stringhe come ID. – Mike

+0

In questa riga: https://github.com/laravel/framework/blob/master/src/Illuminate/Support/Str.php#L190, Taylor controlla se è disponibile, quindi devo presumere che potrebbe non essere sempre. –

+0

Secondo la tua opinione, quickRandom è sufficiente? se dovessi controllare che sia ovviamente unico prima di salvarlo. Le probabilità di due collisioni che si verificano consecutivamente sono molto scarse ...? – Mike

Problemi correlati