50 lines
1.2 KiB
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))
|
|
}
|