-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrango.go
140 lines (117 loc) · 3.45 KB
/
rango.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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package rango
import (
cryptoRand "crypto/rand"
"encoding/binary"
"log"
mathRand "math/rand"
"time"
)
//Characters of random string generator
var charsLowercase = "abcdefghijklmnopqrstuvwxyz"
var charsUppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
var charsNumber = "0123456789"
var charsSpecial = "[](){}^;:#?.,&|!~`_%$@\"'=+-*/\\ <>"
//RnInt generates a random int
func RnInt(startIncluded int, endNotIncluded int) (randomInt int) {
rnInit()
randomInt = startIncluded + mathRand.Intn(endNotIncluded-startIncluded)
return randomInt
}
//RandomInt generates a random int
func RandomInt(startIncluded int, endNotIncluded int) (randomInt int, isSeedTimeDependent bool) {
isSeedTimeDependent = rnInit()
randomInt = startIncluded + mathRand.Intn(endNotIncluded-startIncluded)
return randomInt, isSeedTimeDependent
}
//RnString generates a random string
func RnString(length int, containsLowercase bool, containsUppercase bool, containsNumber bool, containsSpecial bool) (randomString string) {
if !containsLowercase && !containsUppercase && !containsNumber && !containsSpecial {
return ""
}
if length < 1 {
return ""
}
var chars []rune
if containsLowercase {
chars = append(chars, []rune(charsLowercase)...)
}
if containsUppercase {
chars = append(chars, []rune(charsUppercase)...)
}
if containsNumber {
chars = append(chars, []rune(charsNumber)...)
}
if containsSpecial {
chars = append(chars, []rune(charsSpecial)...)
}
rnInit()
b := make([]rune, length)
for i := range b {
b[i] = chars[mathRand.Intn(len(chars))]
}
return string(b)
}
//RandomString generates a random string
func RandomString(length int, containsLowercase bool, containsUppercase bool, containsNumber bool, containsSpecial bool) (randomString string, isSeedTimeDependent bool) {
if !containsLowercase && !containsUppercase && !containsNumber && !containsSpecial {
return "", false
}
if length < 1 {
return "", false
}
var chars []rune
if containsLowercase {
chars = append(chars, []rune(charsLowercase)...)
}
if containsUppercase {
chars = append(chars, []rune(charsUppercase)...)
}
if containsNumber {
chars = append(chars, []rune(charsNumber)...)
}
if containsSpecial {
chars = append(chars, []rune(charsSpecial)...)
}
isSeedTimeDependent = rnInit()
b := make([]rune, length)
for i := range b {
b[i] = chars[mathRand.Intn(len(chars))]
}
return string(b), isSeedTimeDependent
}
//RnStringFrom generates a random string with the given characters
func RnStringFrom(length int, chars string) (randomString string) {
if length < 1 {
return ""
}
rnInit()
b := make([]rune, length)
for i := range b {
b[i] = []rune(chars)[mathRand.Intn(len([]rune(chars)))]
}
return string(b)
}
//RandomStringFrom generates a random string with the given characters
func RandomStringFrom(length int, chars string) (randomString string, isSeedTimeDependent bool) {
if length < 1 {
return "", false
}
isSeedTimeDependent = rnInit()
b := make([]rune, length)
for i := range b {
b[i] = []rune(chars)[mathRand.Intn(len([]rune(chars)))]
}
return string(b), isSeedTimeDependent
}
//rnInit generates random seed
func rnInit() (isSeedTimeDependent bool) {
var b [8]byte
_, err := cryptoRand.Read(b[:])
if err != nil {
log.Println("Unable to generate seed with cryptographically secure random number generator. Time-dependent seed has been used instead.")
mathRand.Seed(time.Now().UnixNano())
return true
}
mathRand.Seed(int64(binary.LittleEndian.Uint64(b[:])))
return false
}