如何在Golang中生成随机字符串?

如何在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/randomWindows Cryptography API 中读取的,具有真正的随机性。

为了便于输出打印,randStringBytesCrypto() 函数中不仅将生成的字节序列进行了 Base64 编码,而且还使用了 Go 标准库 encoding/base64

输出结果:

Jt9O2+st

结论

通过以上两种方法,我们可以在 Golang 中轻松地实现生成随机字符串的目的。在随机性要求不高甚至可以容忍一定的重复的情况下,可以使用 math/rand 模块生成相对较小程度的带随机性的字符串。而在安全性要求较高,比如密钥的生成中,应采用使用 crypto/rand 模块生成真正的随机字符串。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

Go 教程