gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:51:58 35 4
gpt4 key购买 nike

我想做什么:

基于字符串的内容(例如 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/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com