improved random string generation

This commit is contained in:
Sergey Chubaryan 2024-08-06 22:15:57 +03:00
parent 10805ef2d5
commit 0c75d75e24
8 changed files with 78 additions and 25 deletions

View File

@ -1,8 +1,6 @@
package main
import (
"backend/args_parser"
"backend/config"
"backend/logger"
"backend/src/handlers"
"backend/src/middleware"
@ -10,6 +8,8 @@ import (
"backend/src/repo"
"backend/src/services"
"backend/src/utils"
"backend/utils/args_parser"
"backend/utils/config"
"crypto/rsa"
"crypto/x509"
"database/sql"

View File

@ -2,10 +2,8 @@ package services
import (
"backend/src/repo"
"backend/src/utils"
"fmt"
"math/rand"
"strings"
"time"
)
type ShortlinkService interface {
@ -20,33 +18,18 @@ type NewShortlinkServiceParams struct {
func NewShortlinkSevice(params NewShortlinkServiceParams) ShortlinkService {
return &shortlinkService{
randomUtil: *utils.NewRand(),
cache: params.Cache,
}
}
type shortlinkService struct {
randomUtil utils.RandomUtil
cache repo.Cache[string, string]
}
func (s *shortlinkService) randomStr() string {
src := rand.NewSource(time.Now().UnixMicro())
randGen := rand.New(src)
builder := strings.Builder{}
for i := 0; i < 9; i++ {
offset := 0x41
if randGen.Int()%2 == 1 {
offset = 0x61
}
byte := offset + (randGen.Int() % 26)
builder.WriteRune(rune(byte))
}
return builder.String()
}
func (s *shortlinkService) CreateLink(in string) (string, error) {
str := s.randomStr()
str := s.randomUtil.RandomID(10, utils.CharsetAll)
s.cache.Set(str, in, 7*24*60*60)
return str, nil
}

70
src/utils/random.go Normal file
View File

@ -0,0 +1,70 @@
package utils
import (
"math/rand"
"strings"
"time"
)
type Charset int
const (
CharsetAll Charset = iota
CharsetLettersLower
CharsetLettersUpper
CharsetLetters
CharsetNumeric
)
type charsetPart struct {
Offset int
Size int
}
var charsets = map[Charset][]charsetPart{}
func NewRand() *RandomUtil {
charsetLettersLower := charsetPart{ //CharsetLettersLower
Offset: 0x41,
Size: 26,
}
charsetLettersUpper := charsetPart{ //CharsetLettersUpper
Offset: 0x61,
Size: 26,
}
charsetNumeric := charsetPart{ //CharsetLettersNumeric
Offset: 0x30,
Size: 10,
}
charsets = map[Charset][]charsetPart{
CharsetNumeric: {charsetNumeric},
CharsetLettersLower: {charsetLettersLower},
CharsetLettersUpper: {charsetLettersUpper},
CharsetLetters: {charsetLettersLower, charsetLettersUpper},
CharsetAll: {charsetLettersLower, charsetLettersUpper, charsetNumeric},
}
return &RandomUtil{}
}
type RandomUtil struct{}
func (r *RandomUtil) RandomID(outputLenght int, charset Charset) string {
src := rand.NewSource(time.Now().UnixMicro())
randGen := rand.New(src)
charsetData := charsets[charset]
builder := strings.Builder{}
for i := 0; i < outputLenght; i++ {
charsetIdx := randGen.Int() % len(charsetData)
charsetPart := charsetData[charsetIdx]
byte := charsetPart.Offset + (randGen.Int() % charsetPart.Size)
builder.WriteRune(rune(byte))
}
return builder.String()
}