Geração de string aleatória em Go: guia completo com código

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Como gerar uma string aleatória em Go sem enlouquecer?

\n\n

Você já se deparou com uma situação em que precisava criar rapidamente um identificador único, uma senha temporária ou um token para API? Se você programa em Go, mais cedo ou mais tarde enfrentará a pergunta: "Como gerar uma string aleatória de comprimento fixo?". Essa pergunta acumulou milhares de visualizações no Stack Overflow, e não é à toa — uma tarefa aparentemente simples esconde várias armadilhas.

\n\n

Neste artigo, abordaremos a geração de string aleatória em Go, desde soluções simples até abordagens prontas para produção. Você aprenderá por que math/rand pode ser perigoso, como usar crypto/rand para segurança e como escrever um código elegante sem dependências desnecessárias.

\n\n

Por que não usar math/rand para senhas?

\n\n

Vamos começar com a solução mais popular, mas nem sempre correta. Muitos iniciantes escrevem algo como:

\n\n
package main\n\nimport (\n    "math/rand"\n    "time"\n)\n\nconst letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"\n\nfunc RandString(n int) string {\n    b := make([]byte, n)\n    for i := range b {\n        b[i] = letters[rand.Intn(len(letters))]\n    }\n    return string(b)\n}\n\nfunc main() {\n    rand.Seed(time.Now().UnixNano())\n    println(RandString(10))\n}
\n\n

Este código funciona, mas tem uma desvantagem grave: math/rand usa um algoritmo determinístico. Se um invasor descobrir a seed (ou o horário da geração), ele poderá reproduzir toda a sequência. Para dados de teste ou nomes de arquivos, isso é aceitável, mas para tokens secretos e senhas — absolutamente não.

\n\n

Usando crypto/rand: geração segura de string aleatória em Go

\n\n

Para ambientes de produção, a escolha correta é o pacote crypto/rand. Ele usa o gerador de números aleatórios criptograficamente seguro do sistema operacional. Veja como é a geração de string aleatória em Go com crypto/rand:

\n\n
package main\n\nimport (\n    "crypto/rand"\n    "math/big"\n)\n\nconst charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()"\n\nfunc SecureRandomString(length int) (string, error) {\n    result := make([]byte, length)\n    for i := range result {\n        num, err := rand.Int(rand.Reader, big.NewInt(int64(len(charset))))\n        if err != nil {\n            return "", err\n        }\n        result[i] = charset[num.Int64()]\n    }\n    return string(result), nil\n}\n\nfunc main() {\n    str, err := SecureRandomString(16)\n    if err != nil {\n        panic(err)\n    }\n    println(str)\n}
\n\n

Observe: usamos rand.Int com rand.Reader — isso garante que cada caractere seja escolhido de forma aleatória e imprevisível. Para string aleatória em Go, este é o padrão ouro.

\n\n

Otimização de desempenho: como acelerar a geração

\n\n

O loop com chamada a rand.Int para cada caractere pode ser lento ao gerar centenas de milhares de strings. A solução é gerar todos os bytes aleatórios de uma só vez e, em seguida, mapeá-los para o nosso alfabeto. Esse truque é frequentemente discutido no Stack Overflow no contexto de Golang random string:

\n\n
package main\n\nimport (\n    "crypto/rand"\n    "encoding/binary"\n)\n\nconst charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"\n\nfunc FastRandomString(length int) string {\n    result := make([]byte, length)\n    // Geramos números aleatórios de 64 bits\n    buf := make([]byte, 8*length)\n    if _, err := rand.Read(buf); err != nil {\n        panic(err)\n    }\n    for i := 0; i < length; i++ {\n        // Pegamos 8 bytes para cada caractere\n        val := binary.LittleEndian.Uint64(buf[i*8 : (i+1)*8])\n        // Evitamos viés (bias) usando módulo\n        result[i] = charset[val%uint64(len(charset))]\n    }\n    return string(result)\n}\n\nfu                

Blogs

Book Recommendations