Go: Generate a random string (password, booking reference)

Random Unicode string

rand.Seed(time.Now().UnixNano())
chars := []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ" +
        "abcdefghijklmnopqrstuvwxyzåäö" +
        "0123456789")
length := 8
buf := make([]rune, length)
for i := range buf {
        buf[i] = chars[rand.Intn(len(chars))]
}
str := string(buf)

Random ASCII string with at least 1 digit and 1 special character

If all characters can be represented by a single byte, e.g. ASCII characters, you can use []byte instead of []rune.

rand.Seed(time.Now().UnixNano())
digits := "0123456789"
specials := "~=+%^*/()[]{}/!@#$?|"
all := "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
        "abcdefghijklmnopqrstuvwxyz" +
        digits + specials
length := 8
buf := make([]byte, length)
buf[0] = digits[rand.Intn(len(digits))]
buf[1] = specials[rand.Intn(len(specials))]
for i := 2; i < length; i++ {
        buf[i] = all[rand.Intn(len(all))]
}
for i := len(buf) - 1; i > 0; i-- {
        j := rand.Intn(i + 1)
        buf[i], buf[j] = buf[j], buf[i]
}
str := string(buf)

Warning: If you're building a password generator, consider using a string generation algorithm from a high-quality cryptographic library. If you're running your own, and you probably shouldn't, package crypto/rand offers a cryptographically secure pseudorandom number generator.

Comments

Be the first to comment!