PHP: generare una stringa casuale

Si tratta di un’applicazione semplice ed estremamente utile per una varietà di applicazioni.
Definiamo la funzione str_rand, che si basa su mt_rand di PHP, per generare la stringa:

function str_rand($len = 32, $chars='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') {
    $str = '';
    for ($i = 0; $i < $len; $i++) {
        $str .= $chars[mt_rand(0, strlen($chars) - 1)];
    }
    return $str;
}

Con questa funzione possiamo creare un numero impressionante di stringhe diverse. Con i valori di $len e $chars di base, abbiamo una stringa lunga 32 caratteri a partire da una selezione di 62 caratteri, ossia 32^62 combinazioni. Facciamo il calcolo in Python:

>>> "%.2g" % 32**62
'2.1e+93'

Non sono abbastanza? Dato che le combinazioni aumentano esponenzialmente, basterebbe raddoppiare la lunghezza $len della stringa per ottenere 9.6e+111 possibili risultati, cioè più di 4 miliardi di miliardi di volte il numero precedente!

Ma un’alta probabilità non basta a garantire che tutte le stringhe generate siano uniche. Come programmatori dobbiamo stare sulla difensiva, ed essere sicuri al cento per cento che non possano esserci conflitti. Basta implementare un semplice loop per garantire questa condizione:

// Lista delle chiavi gia' generate da non ripetere - ad esempio da una banca dati
$keys = array(...);

$k = str_rand();

while (in_array($k, $keys)) {
    $k = str_rand();
}

Dato l’elevato numero di possibili chiavi, la condizione in_array($k, $keys) sarà quasi sempre falsa, ma se il numero di chiavi già esistenti dovesse essere molto elevato e/o se dovessimo restringere il numero di possibili combinazioni (ad esempio accorciando la chiave o includendo solo le lettere minuscole nel set di partenza, $chars), potrebbe rivelarsi costoso controllare ogni volta tutti i valori di $keys. A questo punto, si potrebbe escogitare un metodo più raffinato di generare le chiavi, ma per gran parte delle applicazioni questo sistema funziona benissimo.

Link utili

mt_rand sul manuale di PHP