Golang 优雅地生成随机字符串

avtion · 2020-08-08 13:15:54 · 453397 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2020-08-08 13:15:54 的主题,其中的信息可能已经有所发展或是发生改变。

Golang 优雅地生成随机字符串

随机字符串都不保证唯一性,服务启动时需要对全局随机种子进行初始化

func init() {
    rand.Seed(time.Now().UnixNano())
}

方法一 (常见,但不优雅

func GetRandomString(n int) string {
    str := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
    bytes := []byte(str)
    var result []byte
    for i := 0; i < n; i++ {
        result = append(result, bytes[rand.Intn(len(bytes))])
    }
    return string(result)
}

Benchmark压力测试 8018 ns/op

image-7iOYcGn.png

方法二(Docker ContainerID 生成方法)

func GetRandomString2(n int) string {
    randBytes := make([]byte, n/2)
    rand.Read(randBytes)
    return fmt.Sprintf("%x", randBytes)
}

Benchmark压力测试 10595 ns/op

image-2E7hUwM.png


有疑问加站长微信联系(非本文作者)

第 1 条附言  ·  2021-08-18 22:01:26

警告:该文章代码不可用,切勿使用该文章的代码!

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

453397 次点击  ∙  1 赞  
加入收藏 微博
9 回复  |  直到 2021-12-30 14:28:39
lzx88
lzx88 · #1 · 4年之前

效率好差

ws1992go
ws1992go · #2 · 4年之前
lzx88lzx88 #1 回复

效率好差

怎么评判的?

liangmanlin
liangmanlin · #3 · 4年之前

写法问题,我来优化,第一个就不可能那么低效率

liangmanlin
liangmanlin · #4 · 4年之前

太误导人了,简单优化后,第一种做法只需要254 ns/op,果然很多人都是不懂装懂,误导人

lzx88
lzx88 · #5 · 4年之前
ws1992gows1992go #2 回复

#1楼 @lzx88 怎么评判的?

能减少随机次数吗 O(n)的现在

ShangYin666
ShangYin666 · #6 · 4年之前

压测的时候就不要标准输出了啊,本来标准输出效率就很差

meiruhua
meiruhua · #7 · 3年之前
liangmanlinliangmanlin #4 回复

太误导人了,简单优化后,第一种做法只需要254 ns/op,果然很多人都是不懂装懂,误导人

优化后的代码呢

liangmanlin
liangmanlin · #8 · 3年之前
meiruhuameiruhua #7 回复

#4楼 @liangmanlin 优化后的代码呢

这还需要代码?你随便把result预先make好长度,都不知道快多少倍,str这种东西还要转成[]byte,都不知道损失多少性能,一看就是入门没学好

lsill
lsill · #9 · 3年之前

上面代码不可用,太多内存分配了,切片在已经长度的时候直接分配容器大小或者长度是最合适的,而且直接用字节数组代表字符串不好吗

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传