Det är i allmänhet inte möjligt att generera sekvenser med både unika och slumpmässiga element:uppenbarligen för att vara unik måste algoritmen ta hänsyn till de tidigare genererade elementen i sekvensen, så de nästa blir inte riktigt slumpmässiga.
Det bästa är därför att upptäcka kollisioner och bara försöka igen (vilket kan bli mycket dyrt i just ditt fall).
Om du är begränsad till bara 7 tecken, finns det inte mycket du kan göra ovan:
$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)};
}
}
Detta bör så småningom ge dig ett nytt lösenord.
Men i liknande fall jag har stött på väljer jag vanligtvis en större lösenordsstorlek som också råkar vara storleken på hex-representationen av en populär hashfunktion (t.ex. md5
). Då kan du göra det lättare för dig själv och mindre felbenägen:
$password = time(); // even better if you have some other "random" input to use here
do {
$password = md5(time().$password);
}
while (already_exists($password));
Detta har också den extra fördelen att sekvensutrymmet är större, varför det blir färre kollisioner. Du kan välja storleken på hashfunktionen enligt det förväntade antalet lösenord som du kommer att generera i framtiden för att "garantera" en låg kollisionssannolikhet och därmed färre anrop till den eventuellt dyra already_exists
funktion.