Skip to content

Instantly share code, notes, and snippets.

@AnkDos
Created October 16, 2021 20:34
Show Gist options
  • Save AnkDos/76186abe7c4592676256864e4a74bdc4 to your computer and use it in GitHub Desktop.
Save AnkDos/76186abe7c4592676256864e4a74bdc4 to your computer and use it in GitHub Desktop.
Random String Generator in Golang
/*
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