package utils import ( "fmt" "github.com/w3liu/go-common/constant/timeformat" "math/rand" "os" "sync/atomic" "time" ) var num int64 func PrefixGenerate(prefix string) string { return prefix + Generate(time.Now()) } // Generate 生成24位订单号 // 前面17位代表时间精确到毫秒,中间3位代表进程id,最后4位代表序号 func Generate(t time.Time) string { s := t.Format(timeformat.Continuity) m := t.UnixNano()/1e6 - t.UnixNano()/1e9*1e3 ms := sup(m, 3) p := os.Getpid() % 1000 ps := sup(int64(p), 3) i := atomic.AddInt64(&num, 1) r := i % 10000 rs := sup(r, 4) n := fmt.Sprintf("%s%s%s%s", s, ms, ps, rs) return n } // 对长度不足n的数字前面补0 func sup(i int64, n int) string { m := fmt.Sprintf("%d", i) for len(m) < n { m = fmt.Sprintf("0%s", m) } return m } // RandomString // size 随机码的位数 // kind 0:纯数字 1:小写字母 2:大写字母 3:数字、大小写字母 func RandomString(size int, kind int) string { iKind, kinds, bytes := kind, [][]int{{10, 48}, {26, 97}, {26, 65}}, make([]byte, size) isAll := kind > 2 || kind < 0 rand.Seed(time.Now().UnixNano()) for i := 0; i < size; i++ { if isAll { // random iKind iKind = rand.Intn(3) } scope, base := kinds[iKind][0], kinds[iKind][1] bytes[i] = uint8(base + rand.Intn(scope)) } return string(bytes) }