package mixrepoimpl import ( "context" "github.com/bwmarrin/snowflake" "hash/fnv" "math" "os" "voucher/internal/biz/mixrepos" "voucher/internal/data" "voucher/internal/pkg/uid" ) type GenerateRepoImpl struct { rdb *data.Rdb node *snowflake.Node } func NewGenerateMixRepoImpl(rdb *data.Rdb) (mixrepos.GenerateMixRepo, error) { g := &GenerateRepoImpl{rdb: rdb} name, err := os.Hostname() if err != nil { return nil, err } serverId := g.hashMod(name) node, err := snowflake.NewNode(int64(serverId)) if err != nil { return nil, err } g.node = node return g, nil } // GeneratorString 生成字符串 func (s *GenerateRepoImpl) GeneratorString(_ context.Context, workId int) (string, error) { return s.node.Generate().String(), nil //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)) }