Por lo general, no es posible generar secuencias con elementos únicos y aleatorios:obviamente, para ser único, el algoritmo debe tener en cuenta los elementos generados previamente en la secuencia, por lo que los siguientes no serán realmente aleatorios.
Por lo tanto, su mejor apuesta sería detectar colisiones y simplemente volver a intentarlo (lo que podría ser muy costoso en su caso particular).
Si está limitado a solo 7 caracteres, no hay mucho que pueda hacer arriba:
$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)};
}
}
Esto eventualmente debería darte una nueva contraseña.
Sin embargo, en casos similares que he encontrado, generalmente elijo un tamaño de contraseña más grande que también es del tamaño de la representación hexadecimal de una función hash popular (por ejemplo, md5
). Entonces puede hacerlo más fácil para usted y menos propenso a errores:
$password = time(); // even better if you have some other "random" input to use here
do {
$password = md5(time().$password);
}
while (already_exists($password));
Esto también tiene la ventaja añadida de que el espacio de la secuencia es más grande, por lo que habrá menos colisiones. Puede elegir el tamaño de la función hash de acuerdo con la cantidad esperada de contraseñas que generará en el futuro para "garantizar" una baja probabilidad de colisión y, por lo tanto, menos llamadas a los posiblemente costosos already_exists
función.