Gerar Sequências Randômicas no PHP

Artigo que apresenta a implementação de uma função em PHP para gerar sequências de caracteres randômicos a partir de conjuntos de caracteres pré-definidos.

Eventualmente, é preciso gerar sequências randômicas em sistemas de informação. Alguns exemplos comuns são: geração de arquivo ou diretório com nome único; geração de sal para senhas; geração de chaves de sessão; geração de textos para captcha; etc.

Para tanto, a forma mais comum de se gerar uma sequência randômica é utilizando a função rand ou a versão melhorada dela, chamada mt_rand. Ambas funcionam da mesma maneira. Particularmente, não sei por que criaram outra função para o mesmo propósito, em todo caso, melhor usar mt_rand.

A função recebe um valor mínimo e máximo e devolve um número inteiro dentro do intervalo proposto (inclusive extremidades).

Para gerar uma sequência randômica, é preciso definir um alfabeto a ser usado e um tamanho desejado. Por exemplo, uma sequência apenas com números, sequência com números e letras, sequência com símbolos, etc. Com o alfabeto em uma variável, e um tamanho desejado, basta escolher randomicamente cada uma das posições da sequência. O mínimo e máximo devem ser de zero até o tamanho do alfabeto menos um. Veja um exemplo:

// Preparando as caracteristicas da sequencia randomica
$tamanho = 8;
$alfabeto = 'abcdefghijklmnopqrstuvwxyz0123456789';
$minimo = 0;
$maximo = strlen($alfabeto) - 1;

// Gerando a sequencia
$sequencia = '';
for ($i = $tamanho; $i > 0; --$i) {

    // Sorteando uma posicao do alfabeto
    $posicao_sorteada = mt_rand($minimo, $maximo);

    // Obtendo o simbolo correspondente do alfabeto
    $caractere_sorteado = $alfabeto[$posicao_sorteada];

    // Incluindo o simbolo na sequencia
    $sequencia .= $caractere_sorteado;
}

// Sequencia pronta
echo $sequencia;

A função abaixo permite que escolher alguns alfabetos pré-definidos:

// Mascaras binarias
define('RANDOM_MAIUSCULAS',  1); // 0001
define('RANDOM_MINUSCULAS',  2); // 0010
define('RANDOM_LETRAS',      3); // 0011
define('RANDOM_NUMEROS',     4); // 0100
define('RANDOM_ALFANUM',     7); // 0111
define('RANDOM_SIMBOLOS',    8); // 1000
define('RANDOM_COMPLETO',   15); // 1111

/**
 * Gera uma sequencia de simbolos randomicos
 * @param int $tamanho Tamanho da string retornada
 * @param int $simbolos Mascara binaria dos tipos de simbolos usados
 * @return string Sequencia de simbolos randomicos
 */
function random($tamanho = 10, $simbolos = RANDOM_ALFANUM) {
    if (!$simbolos) {
        trigger_error('Simbolos invalido', E_USER_ERROR);
        return false;
    }
    $str = '';
    if ($simbolos & RANDOM_MAIUSCULAS) {
        $str .=  'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    }
    if ($simbolos & RANDOM_MINUSCULAS) {
        $str .= 'abcdefghijklmnopqrstuvwxyz';
    }
    if ($simbolos & RANDOM_NUMEROS) {
        $str .= '0123456789';
    }
    if ($simbolos & RANDOM_SIMBOLOS) {
        $str .= '?!@#$%&*()[]{}<>_+-=;:,.';
    }
    $str = str_shuffle($str);
    $ultimo = strlen($str) - 1;

    $saida = '';
    for ($i = abs($tamanho); $i > 0; --$i) {
        $saida .= $str[mt_rand(0, $ultimo)];
    }
    return $saida;
}

Exemplos de uso:

// Geracao de uma sequencia de 30 simbolos com letras maiusculas
$r = random(30, RANDOM_MAIUSCULAS);

// Geracao de uma sequencia de 10 simbolos com letras minusculas e numeros
$r2 = random(10, RANDOM_MINUSCULAS | RANDOM_NUMEROS);

4 comentários