如何在Golang中生成随机字符串?
在Golang中生成随机字符串,可以用到Go标准库中的 math/rand
包和 crypto/rand
包。前者是一个伪随机数生成器,后者则是用于生成真正随机数的包。
生成伪随机字符串
package main
import (
"fmt"
"math/rand"
"time"
)
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
func randStringBytes(n int) string {
b := make([]byte, n)
for i := range b {
b[i] = letterBytes[rand.Intn(len(letterBytes))]
}
return string(b)
}
func main() {
rand.Seed(time.Now().UnixNano()) // 设置随机种子
fmt.Println(randStringBytes(5)) // 生成长度为5的随机字符串
}
代码中 randStringBytes()
函数使用了 rand.Intn()
方法,该方法将值限制在 0 到 len(letterBytes) 之间,来产生一个随机的字节。通过不断执行该方法,最后生成了指定长度的随机字符串。
输出结果:
rVJxM
可以注意到,由于 rand.Intn()
方法的随机数不是真正随机的,所以随机字符串的随机性也就相对较弱。
生成真随机字符串
package main
import (
"crypto/rand"
"encoding/base64"
"fmt"
)
func randStringBytesCrypto(n int) (string, error) {
b := make([]byte, n)
_, err := rand.Read(b)
if err != nil {
return "", err
}
return base64.StdEncoding.EncodeToString(b), nil
}
func main() {
randomString, err := randStringBytesCrypto(5)
if err != nil {
panic(err)
}
fmt.Println(randomString)
}
代码中使用 crypto/rand
包中的 rand.Read()
方法来生成真随机序列,而 crypto/rand
中的随机序列是从 /dev/random
或 Windows Cryptography API
中读取的,具有真正的随机性。
为了便于输出打印,randStringBytesCrypto()
函数中不仅将生成的字节序列进行了 Base64 编码,而且还使用了 Go 标准库 encoding/base64
。
输出结果:
Jt9O2+st
结论
通过以上两种方法,我们可以在 Golang 中轻松地实现生成随机字符串的目的。在随机性要求不高甚至可以容忍一定的重复的情况下,可以使用 math/rand
模块生成相对较小程度的带随机性的字符串。而在安全性要求较高,比如密钥的生成中,应采用使用 crypto/rand
模块生成真正的随机字符串。