123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- 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)
- }
|