Jam*_*mes 3 string random seed go random-seed
我想做的事:
根据字符串的内容(例如a1b2c3d4e5,),我想生成一堆“可重复的”随机事件。在Golang中生成可重复的随机数很容易-您只需使用rand.Seed()函数为随机数生成器播种特定的数,然后完成。
但是,rand.Seed()函数采用int64作为参数。因此,我将需要以某种方式将字符串转换为int64。
我已经尝试过的
我的第一个想法是使用base64对字符串进行编码,然后将字节序列转换为int64。但是,通过一些基本测试,似乎仅支持大约7个长度的字符串。添加第8个字符后,数字保持不变。
我猜这里的根本问题是,可能的字符串值比可能的int64值更多。
那么某种哈希函数呢?我所知道的大多数哈希函数都返回一个字节序列。我需要某种返回int64的哈希函数。也许这种方法也被误导了?
字符串的哈希将解决问题。
您可以使用:
示例代码(游乐场链接):
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()(和导入)即可。您可以在此处找到一个很好的哈希示例列表。
并警告一句:根本不涉及加密应用程序。我假设这是出于非加密目的的用户提供的种子(例如游戏种子)之类的。