Created
October 16, 2021 20:34
-
-
Save AnkDos/76186abe7c4592676256864e4a74bdc4 to your computer and use it in GitHub Desktop.
Random String Generator in Golang
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Author : Ankur | |
Date : 17/10/21 | |
*/ | |
package main | |
import ( | |
"fmt" | |
"math/rand" | |
"strings" | |
"time" | |
) | |
type randomStrGenerator struct { | |
length int | |
specialChar bool | |
caps bool | |
number bool | |
} | |
func (obj randomStrGenerator) generate() string { | |
rand.Seed(time.Now().UnixNano()) | |
setDefault(&obj) | |
var result string | |
var resultantSlice = []string{} | |
mapRatio := map[string]bool{"specialCharRatio": obj.specialChar, "capsRatio": obj.caps, "numberRatio": obj.number} | |
funcMap := map[string]func(int, *[]string){"specialCharRatio": generateSpecialCharSeries, | |
"capsRatio": generateCapsSeries, "numberRatio": generateNumberSeries, "char": generateCharSeries} | |
splitRatioData := splitRatio(obj.length, mapRatio) | |
for key, value := range splitRatioData { | |
funcMap[key](value, &resultantSlice) | |
} | |
result = shuffleAndJoin(resultantSlice) | |
return result | |
} | |
func splitRatio(length int, mapRatio map[string]bool) map[string]int { | |
lowerPercent, upperPercent := 10, 30 | |
randomizedPercentage := rand.Intn(upperPercent-lowerPercent) + lowerPercent | |
deductedLength := 0 | |
var returnMap = map[string]int{} | |
for key, value := range mapRatio { | |
if value { | |
tbDec := (length * randomizedPercentage) / 100 | |
returnMap[key] = tbDec | |
deductedLength += tbDec | |
} | |
} | |
returnMap["char"] = length - deductedLength | |
return returnMap | |
} | |
func generateSeries(length, upperLimit, lowerLimit int, resultantSlice *[]string) { | |
for i := 1; i <= length; i++ { | |
char := rune(rand.Intn(upperLimit-lowerLimit) + lowerLimit) | |
*resultantSlice = append(*resultantSlice, string(char)) | |
} | |
} | |
func generateCharSeries(length int, resultantSlice *[]string) { | |
upperLimit := 122 | |
lowerLimit := 97 | |
generateSeries(length, upperLimit, lowerLimit, resultantSlice) | |
} | |
func generateSpecialCharSeries(length int, resultantSlice *[]string) { | |
upperLimit := 64 | |
lowerLimit := 58 | |
generateSeries(length, upperLimit, lowerLimit, resultantSlice) | |
} | |
func generateCapsSeries(length int, resultantSlice *[]string) { | |
upperLimit := 90 | |
lowerLimit := 65 | |
generateSeries(length, upperLimit, lowerLimit, resultantSlice) | |
} | |
func generateNumberSeries(length int, resultantSlice *[]string) { | |
upperLimit := 57 | |
lowerLimit := 48 | |
generateSeries(length, upperLimit, lowerLimit, resultantSlice) | |
} | |
func shuffleAndJoin(resultantSlice []string) string { | |
rand.Shuffle(len(resultantSlice), func(i, j int) { | |
resultantSlice[i], resultantSlice[j] = resultantSlice[j], resultantSlice[i] | |
}) | |
return strings.Join(resultantSlice, "") | |
} | |
func setDefault(val *randomStrGenerator) { | |
len_data := &val.length | |
if *len_data == 0 { | |
*len_data = 10 | |
} | |
} | |
func main() { | |
var genClass randomStrGenerator | |
genClass.length = 110 | |
genClass.caps = true | |
genClass.specialChar = false | |
genClass.number = false | |
randStr := genClass.generate() | |
fmt.Println(randStr) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment