Mysql
 sql >> Database >  >> RDS >> Mysql

Genera caratteri alfanumerici casuali univoci lunghi 7 caratteri

In genere non è possibile generare sequenze con elementi sia univoci che casuali:ovviamente per essere unico l'algoritmo deve tenere conto degli elementi precedentemente generati nella sequenza, quindi i prossimi non saranno proprio casuali.

Pertanto la soluzione migliore sarebbe rilevare le collisioni e riprovare (che potrebbe essere molto costoso nel tuo caso particolare).

Se sei vincolato a soli 7 caratteri, non puoi fare molto sopra:

$allowed_chars = 'abcdefghijklmnopqrstuvwxz';
$allowed_count = strlen($allowed_chars);
$password = null;
$password_length = 7;

while($password === null || already_exists($password)) {
    $password = '';
    for($i = 0; $i < $password_length; ++$i) {
        $password .= $allowed_chars{mt_rand(0, $allowed_count - 1)};
    }
}

Questo dovrebbe eventualmente darti una nuova password.

Tuttavia, in casi simili che ho riscontrato, di solito scelgo una dimensione della password maggiore che è anche la dimensione della rappresentazione esadecimale di una popolare funzione hash (ad es. md5 ). Quindi puoi renderlo più facile per te stesso e meno soggetto a errori:

$password = time(); // even better if you have some other "random" input to use here

do {
    $password = md5(time().$password);
}
while (already_exists($password));

Questo ha anche il vantaggio aggiuntivo che lo spazio della sequenza è più grande, quindi ci saranno meno collisioni. Puoi scegliere la dimensione della funzione hash in base al numero previsto di password che genererai in futuro per "garantire" una bassa probabilità di collisione e quindi meno chiamate al possibilmente costoso already_exists funzione.