sixty.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package otherutils
  2. import (
  3. "bytes"
  4. "fmt"
  5. "math"
  6. "math/rand"
  7. "strings"
  8. "sync/atomic"
  9. "time"
  10. )
  11. var orderIncrId uint32 //订单自增ID,每次重启从头开始即可
  12. const charset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  13. func ConvertToBase62(decimalNum int64, base int64) string {
  14. if base <= 0 || base > 62 {
  15. return ""
  16. }
  17. var buf bytes.Buffer
  18. for decimalNum > 0 {
  19. remainder := decimalNum % base
  20. decimalNum /= base
  21. buf.WriteByte(charset[remainder])
  22. }
  23. // 将结果反转
  24. result := buf.Bytes()
  25. for i, j := 0, len(result)-1; i < j; i, j = i+1, j-1 {
  26. result[i], result[j] = result[j], result[i]
  27. }
  28. return string(result)
  29. }
  30. // ConvertToDecimal 将 62 进制数转换为十进制数
  31. func ConvertToDecimal(base62 string, base int64) int64 {
  32. // const charset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
  33. // base := int64(62)
  34. var result int64
  35. for i, char := range base62 {
  36. // 找到字符对应的索引
  37. index := strings.IndexRune(charset, char)
  38. // 根据62进制,累加对应的值
  39. result += int64(index) * int64(math.Pow(float64(base), float64(len(base62)-i-1)))
  40. }
  41. return result
  42. }
  43. func CreateOutTradeNo(playerId int64, serverId int64, zoneId int) string {
  44. n := atomic.AddUint32(&orderIncrId, 1)
  45. ct := time.Now()
  46. y, m, d := ct.Date()
  47. h := ct.Hour()
  48. mi := ct.Minute()
  49. s := ct.Second()
  50. num := int64(float64(y)*math.Pow10(10) +
  51. float64(m)*math.Pow10(8) +
  52. float64(d)*math.Pow10(6) +
  53. float64(h)*math.Pow10(4) +
  54. float64(mi)*math.Pow10(2) +
  55. float64(s))
  56. return fmt.Sprintf("%sZ%sZ%sZ%sZ%d",
  57. ConvertToBase62(num, 61),
  58. ConvertToBase62(serverId, 61),
  59. ConvertToBase62(playerId, 61),
  60. ConvertToBase62(int64(n%65536), 61),
  61. zoneId)
  62. // return fmt.Sprintf("%sZ%sZ%sZ%sZ%d",
  63. // ConvertToBase62(num, 36),
  64. // ConvertToBase62(serverId, 36),
  65. // ConvertToBase62(playerId, 36),
  66. // ConvertToBase62(int64(orderNum%65536), 36),
  67. // zoneId)
  68. }
  69. func TestCreateOutTradeNo() {
  70. var (
  71. playerId = 1
  72. serverId = 102
  73. // orderNum = 1
  74. zoneId = 1
  75. )
  76. for i := 0; i < 10000; i += 1 {
  77. playerId += 10000000
  78. // orderNum += 10
  79. orderCode := CreateOutTradeNo(int64(playerId), int64(serverId), zoneId)
  80. fmt.Println(orderCode)
  81. }
  82. }
  83. // 随机不含重复字符的字符串
  84. // l长度 超过20需修改逻辑 命中会降低
  85. func RandString(l int) string {
  86. cl := len(charset)
  87. if l > cl || l <= 0 {
  88. return ""
  89. }
  90. bytes := make([]byte, l)
  91. selected := make(map[byte]bool)
  92. for i := 0; i < l; {
  93. b := rand.Intn(cl)
  94. char := charset[b]
  95. if !selected[char] {
  96. bytes[i] = char
  97. selected[char] = true
  98. i++
  99. }
  100. }
  101. return string(bytes)
  102. }