Geralmente não é possível gerar sequências com elementos únicos e aleatórios:obviamente, para ser único, o algoritmo deve levar em conta os elementos gerados anteriormente na sequência, para que os próximos não sejam realmente aleatórios.
Portanto, sua melhor aposta seria detectar colisões e apenas tentar novamente (o que pode ser muito caro no seu caso particular).
Se você estiver restrito a apenas 7 caracteres, não há muito o que fazer acima:
$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)};
}
}
Isso deve eventualmente fornecer uma nova senha.
No entanto, em casos semelhantes que encontrei, geralmente escolho um tamanho de senha maior, que também é o tamanho da representação hexadecimal de uma função de hash popular (por exemplo,
md5
). Então você pode torná-lo mais fácil para você e menos propenso a erros:$password = time(); // even better if you have some other "random" input to use here
do {
$password = md5(time().$password);
}
while (already_exists($password));
Isso também tem a vantagem adicional de que o espaço de sequência é maior, portanto, haverá menos colisões. Você pode escolher o tamanho da função hash de acordo com os números esperados de senhas que você gerará no futuro para "garantir" uma baixa probabilidade de colisão e, portanto, menos chamadas para o possivelmente caro
already_exists
função.