怎样在Go语言中生成随机种子

怎样在Go语言中生成随机种子

time.Now().UnixNano

这是用的最多的,但是,也是安全隐患最大的方法。

从表面上看go的时间方法最大精度到纳秒,但是好像其实并不能到达的绝对的纳秒精度。

测试结果很不好,碰撞很高。

go 复制代码
import "time"

func TestSeedNanoTime(t *testing.T) {
	var seeds = make(map[int64]bool)
	for i := 0; i < 100000; i++ {
		seed := time.Now().UnixNano()
		seeds[seed] = true
		fmt.Println(seed)
	}
	fmt.Println(len(seeds))
}

maphash.Hash

此方法无碰撞

go 复制代码
import "hash/maphash"

func TestSeedMapHash(t *testing.T) {
	var seeds = make(map[int64]bool)
	for i := 0; i < 100000; i++ {
		seed := int64(new(maphash.Hash).Sum64())
		seeds[seed] = true
		fmt.Println(seed)
	}
	fmt.Println(len(seeds))
}

cryptoRand.Read

该方法无碰撞

go 复制代码
import (
	cryptoRand "crypto/rand"
	mathRand "math/rand"
)

func TestSeedCryptoRand(t *testing.T) {
	var seeds = make(map[int64]bool)
	for i := 0; i < 100000; i++ {
		var b [8]byte
		_, err := cryptoRand.Read(b[:])
		if err != nil {
			panic("cannot seed math/rand package with cryptographically secure random number generator")
		}
		seed := int64(binary.LittleEndian.Uint64(b[:]))
		seeds[seed] = true
		fmt.Println(seed)
	}
	fmt.Println(len(seeds))
}

映射表

该方法无碰撞

go 复制代码
func TestSeedRandomString(t *testing.T) {
	const alpha = "abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789"
	size := 8
	var seeds = make(map[int64]bool)
	for i := 0; i < 100000; i++ {
		buf := make([]byte, size)
		for i := 0; i < size; i++ {
			buf[i] = alpha[mathRand.Intn(len(alpha))]
		}
		seed := int64(binary.LittleEndian.Uint64(buf[:]))
		seeds[seed] = true
		fmt.Println(seed)
	}
	fmt.Println(len(seeds))
}

参考资料

相关推荐
.格子衫.10 小时前
026动态规划之跨步DP——算法备赛
算法·动态规划
roman_日积跬步-终至千里10 小时前
【模式识别与机器学习(7)】主要算法与技术(下篇:高级模型与集成方法)之 扩展线性模型(Extending Linear Models)
人工智能·算法·机器学习
做怪小疯子10 小时前
LeetCode 热题 100——二叉树——二叉树的最大深度
算法·leetcode·职场和发展
William_cl10 小时前
【ASP.NET进阶】Controller 层 Action 核心:异步 Action(async Task)全解析
后端·asp.net
i***279510 小时前
springboot集成onlyoffice(部署+开发)
java·spring boot·后端
Maỿbe10 小时前
暴打力扣之优先级队列(堆)
算法·leetcode·职场和发展
Swift社区10 小时前
LeetCode 438 - 找到字符串中所有字母异位词
算法·leetcode·职场和发展
Java编程爱好者10 小时前
基于SpringAI构建大模型应用
后端
北冥湖畔的燕雀10 小时前
二叉搜索树:高效查找与删除的实现
数据结构·c++·算法
兩尛10 小时前
矩阵中非1的数量 (2025B卷
线性代数·算法·矩阵