-
Notifications
You must be signed in to change notification settings - Fork 0
/
simple.go
58 lines (51 loc) · 1.33 KB
/
simple.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
package rndstr
import (
"io"
"math/rand"
)
// Simple is a simple generator using a given len and range.
// Example use: rndstr.Simple(10, rndstr.Alnum)
func Simple(l int, rng string) string {
buf := make([]byte, l)
rlen := len(rng)
for i := range buf {
buf[i] = rng[rand.Intn(rlen)]
}
return string(buf)
}
// SimpleReader can be used with a random source, such as crypto/rand
//
// This is fairly slow and will consume at least 4 bytes of random input per
// generated character. This is however secure and follows best practices in
// random number generation.
//
// Usage: rndstr.SimpleReader(10, rndstr.Alnum, rand.Reader)
func SimpleReader(l int, rng string, src io.Reader) (string, error) {
buf := make([]byte, l)
rlen := int32(len(rng))
for i := range buf {
v, err := readint31n(src, rlen)
if err != nil {
return "", err
}
buf[i] = rng[v]
}
return string(buf), nil
}
// SimpleFastReader can be used with a random source, such as crypto/rand
//
// Unsafe for secure operations but fast.
//
// Usage: rndstr.SimpleFastReader(10, rndstr.Alnum, rand.Reader)
func SimpleFastReader(l int, rng string, src io.Reader) (string, error) {
buf := make([]byte, l)
_, err := io.ReadFull(src, buf)
if err != nil {
return "", err
}
rlen := len(rng)
for i := range buf {
buf[i] = rng[int(buf[i])%rlen]
}
return string(buf), nil
}