Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Gere caracteres alfanuméricos aleatórios exclusivos com 7 caracteres


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.