Mysql
 sql >> Base de données >  >> RDS >> Mysql

Générer des caractères alphanumériques aléatoires uniques d'une longueur de 7 caractères

Il n'est généralement pas possible de générer des séquences avec à la fois des éléments uniques et aléatoires :évidemment, pour être unique, l'algorithme doit prendre en compte les éléments générés précédemment dans la séquence, donc les suivants ne seront pas vraiment aléatoires.

Par conséquent, votre meilleur pari serait de détecter les collisions et de simplement réessayer (ce qui pourrait être très coûteux dans votre cas particulier).

Si vous êtes limité à seulement 7 caractères, vous ne pouvez pas faire grand-chose ci-dessus :

$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)};
    }
}

Cela devrait éventuellement vous donner un nouveau mot de passe.

Cependant, dans des cas similaires que j'ai rencontrés, je choisis généralement une taille de mot de passe plus grande, qui correspond également à la taille de la représentation hexadécimale d'une fonction de hachage populaire (par exemple, md5 ). Ensuite, vous pouvez vous faciliter la tâche et réduire le risque d'erreur :

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

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

Cela a également l'avantage supplémentaire que l'espace de séquence est plus grand, donc il y aura moins de collisions. Vous pouvez choisir la taille de la fonction de hachage en fonction du nombre attendu de mots de passe que vous générerez à l'avenir pour "garantir" une faible probabilité de collision et donc moins d'appels aux already_exists éventuellement coûteux fonction.