voucher/internal/data/mixrepoimpl/generate.go

50 lines
1.2 KiB
Go

package mixrepoimpl
import (
"context"
"hash/fnv"
"math"
"strconv"
"voucher/internal/biz/mixrepos"
"voucher/internal/data"
"voucher/internal/pkg/uid"
)
type GenerateRepoImpl struct {
rdb *data.Rdb
}
func NewGenerateMixRepoImpl(rdb *data.Rdb) mixrepos.GenerateMixRepo {
return &GenerateRepoImpl{rdb: rdb}
}
// GeneratorString 生成字符串
func (s *GenerateRepoImpl) GeneratorString(ctx context.Context, workId int) (string, error) {
serverIdStr := uid.GetAppId(ctx)
serverId := s.hashMod(serverIdStr)
number, err := uid.NewSignGenerator(s.rdb.Rdb).SetWorkerID(workId).SetServerID(serverId).GetNumber()
if err != nil {
return "", err
}
return strconv.FormatUint(number, 10), nil
}
// GeneratorNumber 生成unit64
func (s *GenerateRepoImpl) GeneratorNumber(ctx context.Context, workId int) (uint64, error) {
serverIdStr := uid.GetAppId(ctx)
serverId := s.hashMod(serverIdStr)
number, err := uid.NewSignGenerator(s.rdb.Rdb).SetWorkerID(workId).SetServerID(serverId).GetNumber()
if err != nil {
return 0, err
}
return number, nil
}
// hashMod hash mod
func (s *GenerateRepoImpl) hashMod(hashStr string) int {
hash := fnv.New32a()
hash.Write([]byte(hashStr))
hashValue := hash.Sum32()
return int(math.Mod(float64(hashValue), 32))
}