Laravel str_random() o una funzione personalizzata?

È il Laravel str_random() funzione abbastanza casuale, in modo che io possa usare per Id?

Per esempio:

str_random(32);

Questo produce una stringa casuale di lunghezza 32 composto da caratteri alfanumerici [a-zA-z0-9] (62 caratteri in totale).

Che equivale a 2272657884496751345355241563627544170162852933518655225856 possibilità.

Tuttavia, la mia domanda è, questo sta per essere abbastanza buono? O devo considerare l’utilizzo di Uuid o un’altra funzione personalizzata.

  • Si può sempre controllare per assicurarsi che non sia un duplicato prima di salvare, come quando la generazione di unico lumache. Certo, è molto improbabile che accada.
InformationsquelleAutor Mike | 2014-04-11

 

2 Replies
  1. 55

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

    public static function quickRandom($length = 16)
    {
        $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    
        return substr(str_shuffle(str_repeat($pool, 5)), 0, $length);
    }
    

    A mio parere quickRandom codice non è affidabile per l’unicità né di crittografia.

    Sì, avere openssl_random_pseudo_bytes e con 32 byte è quasi impossibile vedere una collisione, ma è ancora possibile. Se si desidera assicurarsi che le stringhe e numeri sarà unico (al 99,99%), è meglio utilizzare un UUID funzione. 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 un VALIDO RFC 4211 versione COMPATIBILE 4 UUID.

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

    • Dove è stato, se è disponibile’ rispetto al openssl, perché non dovrebbe essere? Inoltre, qual è il metodo migliore per originalità, come sarò usando le corde come Id.
    • In questa riga: github.com/laravel/framework/blob/master/src/Illuminate/Support/…, Taylor controllare se è disponibile, quindi devo presumere potrebbe non essere sempre.
    • A suo parere, sarebbe quickRandom bastare? se dovessi verificare che si tratta di un corso unico, prima di salvarlo. Possibilità di due collisioni che si verificano consecutivamente sono molto scarse…?
    • Non è così. Può essere buono per la creazione di file temporanei/eliminazione, o per fornire html id univoco sulle pagine, per dare alcuni esempi, ma non deve essere utilizzato come id. Modificato per renderlo più chiaro.
    • Giusto per essere sicuri, quindi, è bene usare l’UUID come un ID all’interno di un database piuttosto che auto-incremento numero intero?
    • Non c’è il 100% di sicurezza in questo caso, credo che sia molto sicuro, ma vorrei comunque provare a prendere (save(), crea() o update()) e di generare un nuovo UUID, in caso di collisione.
    • Grazie, guarderò in attuazione del UUID ID, anche l’aggiunta di un try-catch quando ha a che fare con il DB.
    • C’era un bug di PHP attuazione di OpenSSL mi tonnellate di collisioni, che è fissata nelle seguenti versioni: >= 5.4.44, >= 5.5.28, >= 5.6.13, >= 7.0.0
    • Per la tua UUID, tutto quello che stai facendo è la generazione di realmente un lungo numero casuale basato interamente off mt_rand(). Sarebbe non è diverso dal fare mt_rand($largeNumber, $largerNumber)… sei solo l’aggiunta di alcune gocce di far apparire meno come realmente un lungo numero.

Lascia un commento