Het is over het algemeen niet mogelijk om reeksen te genereren met zowel unieke als willekeurige elementen:om uniek te zijn, moet het algoritme natuurlijk rekening houden met de eerder gegenereerde elementen in de reeks, dus de volgende zullen niet echt willekeurig zijn.
Daarom kunt u het beste botsingen detecteren en het gewoon opnieuw proberen (wat in uw specifieke geval erg duur kan zijn).
Als je beperkt bent tot slechts 7 tekens, kun je hierboven niet veel doen:
$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)};
}
}
Dit zou u uiteindelijk een nieuw wachtwoord moeten opleveren.
In soortgelijke gevallen die ik ben tegengekomen, kies ik echter meestal een grotere wachtwoordgrootte, wat ook de grootte is van de hex-representatie van een populaire hash-functie (bijv. md5
). Dan kunt u het uzelf gemakkelijker maken en minder foutgevoelig:
$password = time(); // even better if you have some other "random" input to use here
do {
$password = md5(time().$password);
}
while (already_exists($password));
Dit heeft ook als bijkomend voordeel dat de sequentieruimte groter is, waardoor er minder botsingen zullen zijn. U kunt de grootte van de hash-functie kiezen op basis van het verwachte aantal wachtwoorden dat u in de toekomst zult genereren om een lage kans op botsingen te "garanderen" en dus minder aanroepen naar de mogelijk dure already_exists
functie.