По принцип не е възможно да се генерират последователности както с уникални, така и с произволни елементи:очевидно, за да бъде уникален, алгоритъмът трябва да вземе предвид по-рано генерираните елементи в последователността, така че следващите няма да са наистина произволни.
Следователно най-добрият ви залог би бил да откриете сблъсъци и просто да опитате отново (което може да е много скъпо във вашия конкретен случай).
Ако сте ограничени само до 7 знака, не можете да направите много по-горе:
$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)};
}
}
Това в крайна сметка трябва да ви даде нова парола.
Въпреки това, в подобни случаи, които съм срещал, обикновено избирам по-голям размер на паролата, който също е размерът на шестнадесетичното представяне на популярна хеш функция (напр. md5
). Тогава можете да го направите по-лесно за себе си и по-малко податливи на грешки:
$password = time(); // even better if you have some other "random" input to use here
do {
$password = md5(time().$password);
}
while (already_exists($password));
Това също има допълнителното предимство, че пространството на последователността е по-голямо, следователно ще има по-малко сблъсъци. Можете да изберете размера на хеш функцията според очаквания брой пароли, които ще генерирате в бъдеще, за да "гарантирате" ниска вероятност за сблъсък и по този начин по-малко извиквания към евентуално скъпите already_exists
функция.