我想做什么:
基于字符串的内容(例如 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/