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

Generer unikke tilfældige alfanumeriske tegn, der er 7 tegn lange

Det er generelt ikke muligt at generere sekvenser med både unikke og tilfældige elementer:For at være unik skal algoritmen naturligvis tage hensyn til de tidligere genererede elementer i sekvensen, så de næste vil ikke rigtig være tilfældige.

Derfor ville dit bedste bud være at opdage kollisioner og bare prøve igen (hvilket kan være meget dyrt i dit særlige tilfælde).

Hvis du er begrænset til kun 7 tegn, er der ikke meget du kan gøre ovenfor:

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

Dette skulle til sidst give dig en ny adgangskode.

Men i lignende tilfælde, jeg har stødt på, vælger jeg normalt en større adgangskodestørrelse, som også tilfældigvis er størrelsen af ​​hex-repræsentationen af ​​en populær hash-funktion (f.eks. md5 ). Så kan du gøre det lettere for dig selv og mindre udsat for fejl:

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

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

Dette har også den ekstra fordel, at sekvensrummet er større, hvorfor der vil være færre kollisioner. Du kan vælge størrelsen på hash-funktionen i henhold til det forventede antal af adgangskoder, du vil generere i fremtiden for at "garantere" en lav kollisionssandsynlighed og dermed færre opkald til de muligvis dyre already_exists funktion.



  1. Oprettelse af en Java-applikation i Oracle JDeveloper, del 1

  2. Sådan undslipper du værdi søgeord i mysql, mens du bruger Select-sætning

  3. JSP-kodning under indsættelse af ikke-engelsk tekst i MySQL-databasen

  4. Sådan løses adgang nægtet for bruger 'root'@'localhost' (ved hjælp af adgangskode:Ja) når du forbinder MySQL-databasen