目录
- time.Now().UnixNano
- maphash.Hash
- cryptoRand.Read
- 映射表
- 参考资料
time.Now().UnixNano
这是用的最多的,但是,也是安全隐患最大的方法。
从表面上看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
此方法无碰撞
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
该方法无碰撞
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)) }
映射表
该方法无碰撞
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
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)