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.