trade_no.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package utils
  2. import (
  3. "fmt"
  4. "github.com/w3liu/go-common/constant/timeformat"
  5. "math/rand"
  6. "os"
  7. "sync/atomic"
  8. "time"
  9. )
  10. var num int64
  11. func PrefixGenerate(prefix string) string {
  12. return prefix + Generate(time.Now())
  13. }
  14. // Generate 生成24位订单号
  15. // 前面17位代表时间精确到毫秒,中间3位代表进程id,最后4位代表序号
  16. func Generate(t time.Time) string {
  17. s := t.Format(timeformat.Continuity)
  18. m := t.UnixNano()/1e6 - t.UnixNano()/1e9*1e3
  19. ms := sup(m, 3)
  20. p := os.Getpid() % 1000
  21. ps := sup(int64(p), 3)
  22. i := atomic.AddInt64(&num, 1)
  23. r := i % 10000
  24. rs := sup(r, 4)
  25. n := fmt.Sprintf("%s%s%s%s", s, ms, ps, rs)
  26. return n
  27. }
  28. // 对长度不足n的数字前面补0
  29. func sup(i int64, n int) string {
  30. m := fmt.Sprintf("%d", i)
  31. for len(m) < n {
  32. m = fmt.Sprintf("0%s", m)
  33. }
  34. return m
  35. }
  36. // RandomString
  37. // size 随机码的位数
  38. // kind 0:纯数字 1:小写字母 2:大写字母 3:数字、大小写字母
  39. func RandomString(size int, kind int) string {
  40. iKind, kinds, bytes := kind, [][]int{{10, 48}, {26, 97}, {26, 65}}, make([]byte, size)
  41. isAll := kind > 2 || kind < 0
  42. rand.Seed(time.Now().UnixNano())
  43. for i := 0; i < size; i++ {
  44. if isAll { // random iKind
  45. iKind = rand.Intn(3)
  46. }
  47. scope, base := kinds[iKind][0], kinds[iKind][1]
  48. bytes[i] = uint8(base + rand.Intn(scope))
  49. }
  50. return string(bytes)
  51. }