...
1
2
3
4
5
6
7
8 package randutil
9
10 import (
11 crand "crypto/rand"
12 "fmt"
13 "io"
14
15 xrand "go.mongodb.org/mongo-driver/internal/rand"
16 )
17
18
19
20
21 func NewLockedRand() *xrand.Rand {
22 var randSrc = new(xrand.LockedSource)
23 randSrc.Seed(cryptoSeed())
24 return xrand.New(randSrc)
25 }
26
27
28
29
30 func cryptoSeed() uint64 {
31 var b [8]byte
32 _, err := io.ReadFull(crand.Reader, b[:])
33 if err != nil {
34 panic(fmt.Errorf("failed to read 8 bytes from a \"crypto/rand\".Reader: %v", err))
35 }
36
37 return (uint64(b[0]) << 0) | (uint64(b[1]) << 8) | (uint64(b[2]) << 16) | (uint64(b[3]) << 24) |
38 (uint64(b[4]) << 32) | (uint64(b[5]) << 40) | (uint64(b[6]) << 48) | (uint64(b[7]) << 56)
39 }
40
View as plain text