string - 如何使用字符串作为 Golang 中 rand.Seed() 函数的输入?

标签 string go random seed random-seed

我想做什么:

基于字符串的内容(例如 a1b2c3d4e5),我想生成一堆“可重复”的随机事件。在 Golang 中生成可重复的随机数很容易——您只需使用 rand.Seed() 为随机数生成器播种特定的数字即可。功能,然后你就完成了。

然而,rand.Seed()函数以 int64 作为参数。所以我需要以某种方式将字符串转换为 int64。

我已经尝试过的:

我的第一个想法是使用 base64 对字符串进行编码,然后将字节序列转换为 int64。但是,通过一些基本测试,似乎只支持长度为 7 左右的字符串。添加第 8 个字符后,数字保持不变。

我想这里的根本问题是可能的字符串值多于可能的 int64 值。

那么某种哈希函数呢?我所知道的大多数哈希函数都会返回一个字节序列;我需要某种返回 int64 的哈希函数。也许这种方法也被误导了?

最佳答案

字符串的哈希值就可以了。

您可以使用:

  • md5字符串的总和(返回 16 个字节)
  • 将前 8 个字节转换为 uint64(binary.BigEndian.Uint64 忽略其余部分。如果您的输入少于 8 个字节,它将崩溃)。

示例代码(playground link):

package main

import (
    "crypto/md5"
    "encoding/binary"
    "fmt"
    "io"
    "math/rand"
)

func main() {
    h := md5.New()
    io.WriteString(h, "And Leon's getting larger!")
    var seed uint64 = binary.BigEndian.Uint64(h.Sum(nil))
    fmt.Println(seed)
    rand.Seed(int64(seed))
    fmt.Println(rand.Int())
}

打印:

2458341265858962012
792667671

注意:md5只是一个例子。您可以使用任何生成至少 8 个字节的散列。例如:sha256 .只需将 md5.New() 替换为 sha256.New()(和导入)。 您可以找到一个不错的哈希示例列表 here .

还有一个重要的警告:这根本不涉及加密应用程序。我假设这是用于非加密目的的用户提供的种子(例如:游戏种子)。

关于string - 如何使用字符串作为 Golang 中 rand.Seed() 函数的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48307105/

相关文章:

c++ - 使用 TR1/dev/random 在 C++ 中生成随机数(弹性到 <1 秒运行)

c# - 如何根据文件大小将文件平均分配给用户?

python - 简单的 python 2.7 代码有某种问题 : "' list' object has no attribute 'find' "

sorting - 如何防止 map 排序?

api - SkyScanner RapidAPI 不提供回程航类

R中均匀分布的随机子样本

JavaScript 洗牌所以没有三套相同的花色

regex - 从没有正则表达式的字符串中剪切 url

java - 替换不必要的 scan.nextLine(); 的更好方法找到 StdIn 字符串?

xml - Go 中的低级 XML 流编写器?