Es ist im Allgemeinen nicht möglich, Sequenzen mit sowohl eindeutigen als auch zufälligen Elementen zu generieren:Um eindeutig zu sein, muss der Algorithmus offensichtlich die zuvor generierten Elemente in der Sequenz berücksichtigen, sodass die nächsten nicht wirklich zufällig sind.
Daher wäre es am besten, Kollisionen zu erkennen und es einfach erneut zu versuchen (was in Ihrem speziellen Fall sehr teuer werden könnte).
Wenn Sie auf nur 7 Zeichen beschränkt sind, können Sie oben nicht viel tun:
$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)};
}
}
Dies sollte Ihnen schließlich ein neues Passwort geben.
In ähnlichen Fällen, denen ich begegnet bin, wähle ich jedoch normalerweise eine größere Passwortgröße, die zufällig auch die Größe der Hex-Darstellung einer beliebten Hash-Funktion ist (z. B. md5
). Dann können Sie es sich einfacher und weniger fehleranfällig machen:
$password = time(); // even better if you have some other "random" input to use here
do {
$password = md5(time().$password);
}
while (already_exists($password));
Dies hat auch den zusätzlichen Vorteil, dass der Sequenzraum größer ist und daher weniger Kollisionen auftreten. Sie können die Größe der Hash-Funktion entsprechend der erwarteten Anzahl von Passwörtern wählen, die Sie in Zukunft generieren werden, um eine geringe Kollisionswahrscheinlichkeit und damit weniger Aufrufe der möglicherweise teuren already_exists
zu "garantieren". Funktion.