8
8
)
9
9
10
10
var defaultAlphabet = []rune ("_-0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" )
11
+
11
12
const (
12
13
defaultSize = 21
13
14
defaultMaskSize = 5
@@ -19,26 +20,13 @@ type Generator func([]byte) (int, error)
19
20
// BytesGenerator is the default bytes generator
20
21
var BytesGenerator Generator = rand .Read
21
22
22
- func initMasks (params ... int ) []uint {
23
- var size int
24
- if len (params ) == 0 {
25
- size = defaultMaskSize
26
- } else {
27
- size = params [0 ]
28
- }
29
- masks := make ([]uint , size )
30
- for i := 0 ; i < size ; i ++ {
31
- shift := 3 + i
32
- masks [i ] = (2 << uint (shift )) - 1
33
- }
34
- return masks
35
- }
36
-
37
- func getMask (alphabet []rune , masks []uint ) int {
38
- for i := 0 ; i < len (masks ); i ++ {
39
- curr := int (masks [i ])
40
- if curr >= len (alphabet )- 1 {
41
- return curr
23
+ // getMask generates bit mask used to obtain bits from the random bytes that are used to get index of random character
24
+ // from the alphabet. Example: if the alphabet has 6 = (110)_2 characters it is sufficient to use mask 7 = (111)_2
25
+ func getMask (alphabetSize int ) int {
26
+ for i := 1 ; i <= 8 ; i ++ {
27
+ mask := (2 << uint (i )) - 1
28
+ if mask >= alphabetSize - 1 {
29
+ return mask
42
30
}
43
31
}
44
32
return 0
@@ -55,8 +43,7 @@ func Generate(rawAlphabet string, size int) (string, error) {
55
43
return "" , fmt .Errorf ("size must be positive integer" )
56
44
}
57
45
58
- masks := initMasks (size )
59
- mask := getMask (alphabet , masks )
46
+ mask := getMask (len (alphabet ))
60
47
ceilArg := 1.6 * float64 (mask * size ) / float64 (len (alphabet ))
61
48
step := int (math .Ceil (ceilArg ))
62
49
0 commit comments