improved random string generation
This commit is contained in:
parent
10805ef2d5
commit
0c75d75e24
4
main.go
4
main.go
@ -1,8 +1,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"backend/args_parser"
|
|
||||||
"backend/config"
|
|
||||||
"backend/logger"
|
"backend/logger"
|
||||||
"backend/src/handlers"
|
"backend/src/handlers"
|
||||||
"backend/src/middleware"
|
"backend/src/middleware"
|
||||||
@ -10,6 +8,8 @@ import (
|
|||||||
"backend/src/repo"
|
"backend/src/repo"
|
||||||
"backend/src/services"
|
"backend/src/services"
|
||||||
"backend/src/utils"
|
"backend/src/utils"
|
||||||
|
"backend/utils/args_parser"
|
||||||
|
"backend/utils/config"
|
||||||
"crypto/rsa"
|
"crypto/rsa"
|
||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
"database/sql"
|
"database/sql"
|
||||||
|
|||||||
@ -2,10 +2,8 @@ package services
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"backend/src/repo"
|
"backend/src/repo"
|
||||||
|
"backend/src/utils"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/rand"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type ShortlinkService interface {
|
type ShortlinkService interface {
|
||||||
@ -20,33 +18,18 @@ type NewShortlinkServiceParams struct {
|
|||||||
|
|
||||||
func NewShortlinkSevice(params NewShortlinkServiceParams) ShortlinkService {
|
func NewShortlinkSevice(params NewShortlinkServiceParams) ShortlinkService {
|
||||||
return &shortlinkService{
|
return &shortlinkService{
|
||||||
cache: params.Cache,
|
randomUtil: *utils.NewRand(),
|
||||||
|
cache: params.Cache,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type shortlinkService struct {
|
type shortlinkService struct {
|
||||||
cache repo.Cache[string, string]
|
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) {
|
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)
|
s.cache.Set(str, in, 7*24*60*60)
|
||||||
return str, nil
|
return str, nil
|
||||||
}
|
}
|
||||||
|
|||||||
70
src/utils/random.go
Normal file
70
src/utils/random.go
Normal 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()
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user