package main import ( "crypto/rand" "fmt" "sync/atomic" "time" ) type nameGen struct { prefix string counter atomic.Uint64 } func NewNameGen() *nameGen { currentTime := time.Now().Unix() randBytes := make([]byte, 8) _, err := rand.Read(randBytes) if err != nil { panic(err) } alpha := []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZ") uniqRunID := "" for _, b := range randBytes { uniqRunID += string(alpha[int(b)%len(alpha)]) } return &nameGen{ prefix: fmt.Sprintf("%d-%s", currentTime, uniqRunID), counter: atomic.Uint64{}, } } func (n *nameGen) Next() string { return fmt.Sprintf("%s-%d", n.prefix, n.counter.Add(1)) }