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

Jam*_*mes 3 string random seed go random-seed

我想做的事:

根据字符串的内容(例如a1b2c3d4e5,),我想生成一堆“可重复的”随机事件。在Golang中生成可重复的随机数很容易-您只需使用rand.Seed()函数为随机数生成器播种特定的数,然后完成。

但是,rand.Seed()函数采用int64作为参数。因此,我将需要以某种方式将字符串转换为int64。

我已经尝试过的

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

我猜这里的根本问题是,可能的字符串值比可能的int64值更多。

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

Mar*_*arc 6

字符串的哈希将解决问题。

您可以使用:

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

示例代码(游乐场链接):

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())
}
Run Code Online (Sandbox Code Playgroud)

印刷品:

2458341265858962012
792667671
Run Code Online (Sandbox Code Playgroud)

注意:md5只是一个示例。您可以使用至少生成8个字节的任何哈希。例如:sha256。只需替换md5.New()sha256.New()(和导入)即可。您可以在此处找到一个很好的哈希示例列表。

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