-
Notifications
You must be signed in to change notification settings - Fork 2
/
fastrand.go
74 lines (63 loc) · 1.26 KB
/
fastrand.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package common
import (
"math/rand"
"runtime"
"sync"
"time"
)
var (
randCh = make(chan *rand.Rand, runtime.NumCPU())
randChOnce sync.Once
)
const (
chars = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
charsLen = len(chars)
addrCharSet = "abcdef0123456789"
addrCharSetLen = len(addrCharSet)
)
func initRandCh() {
for i := 0; i < runtime.NumCPU(); i++ {
randCh <- rand.New(rand.NewSource(time.Now().Add(time.Second * time.Duration(i)).UnixNano()))
}
}
func fastRandomString(l uint) string {
randChOnce.Do(initRandCh)
r := <-randCh
s := make([]byte, l)
for i := 0; i < int(l); i++ {
s[i] = chars[r.Intn(charsLen)]
}
randCh <- r
return string(s)
}
func fastRandomInt(min, max int) int {
randChOnce.Do(initRandCh)
r := <-randCh
i := r.Intn(max-min) + min
randCh <- r
return i
}
func fastRandomInt63() int64 {
randChOnce.Do(initRandCh)
r := <-randCh
i := r.Int63()
randCh <- r
return i
}
func fastRandomIntn(num int) int {
randChOnce.Do(initRandCh)
r := <-randCh
i := r.Intn(num)
randCh <- r
return i
}
func fastRandomAddr() string {
randChOnce.Do(initRandCh)
r := <-randCh
s := make([]byte, 40)
for i := 0; i < 40; i++ {
s[i] = addrCharSet[r.Intn(addrCharSetLen)]
}
randCh <- r
return string(s)
}