当前位置: 首页 > 面试题库 >

在Go中生成长随机字符串的最快方法是什么?

窦国源
2023-03-14
问题内容

类似于[a-zA-Z0-9]字符串:

na1dopW129T0anN28udaZ

或十六进制字符串:

8c6f78ac23b4a7b8c0182d

长期以来,我的意思是2K和更多字符。


问题答案:

这在我的盒子上大约有200MBps。有明显的改进空间。

type randomDataMaker struct {
    src rand.Source
}

func (r *randomDataMaker) Read(p []byte) (n int, err error) {
    for i := range p {
        p[i] = byte(r.src.Int63() & 0xff)
    }
    return len(p), nil
}

您只io.CopyN需要生成所需的字符串即可。显然,您可以在途中或其他情况下调整字符集。

这个模型的好处是,它只是一个,io.Reader因此您可以使用它制作任何东西。

测试如下:

func BenchmarkRandomDataMaker(b *testing.B) {
    randomSrc := randomDataMaker{rand.NewSource(1028890720402726901)}
    for i := 0; i < b.N; i++ {
        b.SetBytes(int64(i))
        _, err := io.CopyN(ioutil.Discard, &randomSrc, int64(i))
        if err != nil {
            b.Fatalf("Error copying at %v: %v", i, err)
        }
    }
}

在我的2.2GHz i7的一个核心上:

BenchmarkRandomDataMaker       50000        246512 ns/op     202.83 MB/s

编辑

自从编写基准测试以来,我认为我会做一些明显的改进(减少对随机性的呼唤)。使用rand的1/8调用,它的运行速度快了大约4倍,尽管这是一个很大的丑陋之处:

新版本:

func (r *randomDataMaker) Read(p []byte) (n int, err error) {
    todo := len(p)
    offset := 0
    for {
        val := int64(r.src.Int63())
        for i := 0; i < 8; i++ {
            p[offset] = byte(val & 0xff)
            todo--
            if todo == 0 {
                return len(p), nil
            }
            offset++
            val >>= 8
        }
    }

    panic("unreachable")
}

新基准:

BenchmarkRandomDataMaker      200000        251148 ns/op     796.34 MB/s

编辑2

因为它是多余的,所以在强制转换为字节时使用了掩码。更快地得到了很多:

BenchmarkRandomDataMaker      200000        231843 ns/op     862.64 MB/s

(这是这么多比真正的工作更容易 叹息

编辑3

这是今天在irc中提出的,所以我发布了一个库。另外,我的实际基准测试工具虽然对相对速度有用,但其报告不够准确。

我创建了randbo,您可以在需要它们的地方重复使用它们以产生随机流。



 类似资料:
  • 问题内容: 对于一个项目,我需要一种创建数千个随机字符串同时保持较低冲突的方法。我正在寻找长度只有12个字符且只有大写的字符。有什么建议? 问题答案: 码: 输出: 5个例子: 编辑: 如果你只需要数字,使用恒定的,而不是从一个模块。 3个例子:

  • 问题内容: 在Go语言中,我只需要一个随机的字符串(大写或小写),没有数字。最快和最简单的方法是什么? 问题答案: Paul的解决方案提供了一个 简单的 通用解决方案。 问题要求 “最快,最简单的方法” 。让我们也讨论 最快的 部分。我们将以迭代的方式得出最终的最快的代码。对每个迭代进行基准测试可以在答案的结尾处找到。 所有解决方案和基准代码都可以在GoPlayground上找到。Playgrou

  • 在Go中,我只想要一个随机的字符串(大写或小写),没有数字。最快和最简单的方法是什么?

  • 本文向大家介绍JavaScript生成随机字符串的方法,包括了JavaScript生成随机字符串的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript生成随机字符串的方法。分享给大家供大家参考。具体分析如下: 这里使用JavaScript生成一个随机字符串,可以指定字符串的长度。 希望本文所述对大家的javascript程序设计有所帮助。

  • 本文向大家介绍在JavaScript中生成指定长度的随机字符串,包括了在JavaScript中生成指定长度的随机字符串的使用技巧和注意事项,需要的朋友参考一下 我们需要编写一个JavaScript函数,该函数接受数字n,并返回长度为n的随机字符串,其中不包含26个英文小写字母。 因此,让我们为该函数编写代码- 示例 为此的代码将是- 输出结果 控制台中的输出将为- 注意-这是许多可能的输出之一。控

  • 问题内容: 我想要一个5个字符串,该字符串由从集合中随机选择的字符组成。 用JavaScript做到这一点的最佳方法是什么? 问题答案: 我认为这将为您工作: