詳解如何在Go語(yǔ)言中生成隨機(jī)種子
time.Now().UnixNano
這是用的最多的,但是,也是安全隱患最大的方法。
從表面上看go的時(shí)間方法最大精度到納秒,但是好像其實(shí)并不能到達(dá)的絕對(duì)的納秒精度。
測(cè)試結(jié)果很不好,碰撞很高。
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
此方法無(wú)碰撞
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
該方法無(wú)碰撞
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))
}
映射表
該方法無(wú)碰撞
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))
}
參考資料
How to properly seed random number generator
到此這篇關(guān)于詳解如何在Go語(yǔ)言中生成隨機(jī)種子的文章就介紹到這了,更多相關(guān)Go生成隨機(jī)種子內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言MySQLCURD數(shù)據(jù)庫(kù)操作示例詳解
這篇文章主要為大家介紹了Go語(yǔ)言MySQLCURD數(shù)據(jù)庫(kù)操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
go語(yǔ)言yaml轉(zhuǎn)map、map遍歷的實(shí)現(xiàn)
本文主要介紹了go語(yǔ)言yaml轉(zhuǎn)map、map遍歷的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
多階段構(gòu)建優(yōu)化Go?程序Docker鏡像
這篇文章主要為大家介紹了多階段構(gòu)建優(yōu)化Go?程序Docker鏡像,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
golang實(shí)現(xiàn)并發(fā)控制的方法和技巧
golang 是一門支持并發(fā)的編程語(yǔ)言,它提供了 goroutine 和 channel 等強(qiáng)大的特性,讓我們可以輕松地創(chuàng)建和管理多個(gè)執(zhí)行單元,實(shí)現(xiàn)高效的任務(wù)處理,在本文中,我們將介紹一些 golang 的并發(fā)控制的方法和技巧,希望對(duì)你有所幫助2024-03-03
Go語(yǔ)言實(shí)現(xiàn)類似c++中的多態(tài)功能實(shí)例
Go本身不具有多態(tài)的特性,不能夠像Java、C++那樣編寫多態(tài)類、多態(tài)方法。但是,使用Go可以編寫具有多態(tài)功能的類綁定的方法。下面來(lái)一起看看吧2016-09-09
Golang中HTTP路由設(shè)計(jì)的使用與實(shí)現(xiàn)
這篇文章主要介紹了Golang中HTTP路由設(shè)計(jì)的使用與實(shí)現(xiàn),為什么要設(shè)計(jì)路由規(guī)則,因?yàn)槁酚梢?guī)則是HTTP的請(qǐng)求按照一定的規(guī)則 ,匹配查找到對(duì)應(yīng)的控制器并傳遞執(zhí)行的邏輯,需要的朋友可以參考下2023-05-05
go語(yǔ)言中切片的長(zhǎng)度和容量的區(qū)別
這篇文章主要介紹了go語(yǔ)言中切片的長(zhǎng)度和容量的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04

