123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- package otherutils
- import (
- "bytes"
- "fmt"
- "math"
- "math/rand"
- "strings"
- "sync/atomic"
- "time"
- )
- var orderIncrId uint32 //订单自增ID,每次重启从头开始即可
- const charset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
- func ConvertToBase62(decimalNum int64, base int64) string {
- if base <= 0 || base > 62 {
- return ""
- }
- var buf bytes.Buffer
- for decimalNum > 0 {
- remainder := decimalNum % base
- decimalNum /= base
- buf.WriteByte(charset[remainder])
- }
- // 将结果反转
- result := buf.Bytes()
- for i, j := 0, len(result)-1; i < j; i, j = i+1, j-1 {
- result[i], result[j] = result[j], result[i]
- }
- return string(result)
- }
- // ConvertToDecimal 将 62 进制数转换为十进制数
- func ConvertToDecimal(base62 string, base int64) int64 {
- // const charset = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
- // base := int64(62)
- var result int64
- for i, char := range base62 {
- // 找到字符对应的索引
- index := strings.IndexRune(charset, char)
- // 根据62进制,累加对应的值
- result += int64(index) * int64(math.Pow(float64(base), float64(len(base62)-i-1)))
- }
- return result
- }
- func CreateOutTradeNo(playerId int64, serverId int64, zoneId int) string {
- n := atomic.AddUint32(&orderIncrId, 1)
- ct := time.Now()
- y, m, d := ct.Date()
- h := ct.Hour()
- mi := ct.Minute()
- s := ct.Second()
- num := int64(float64(y)*math.Pow10(10) +
- float64(m)*math.Pow10(8) +
- float64(d)*math.Pow10(6) +
- float64(h)*math.Pow10(4) +
- float64(mi)*math.Pow10(2) +
- float64(s))
- return fmt.Sprintf("%sZ%sZ%sZ%sZ%d",
- ConvertToBase62(num, 61),
- ConvertToBase62(serverId, 61),
- ConvertToBase62(playerId, 61),
- ConvertToBase62(int64(n%65536), 61),
- zoneId)
- // return fmt.Sprintf("%sZ%sZ%sZ%sZ%d",
- // ConvertToBase62(num, 36),
- // ConvertToBase62(serverId, 36),
- // ConvertToBase62(playerId, 36),
- // ConvertToBase62(int64(orderNum%65536), 36),
- // zoneId)
- }
- func TestCreateOutTradeNo() {
- var (
- playerId = 1
- serverId = 102
- // orderNum = 1
- zoneId = 1
- )
- for i := 0; i < 10000; i += 1 {
- playerId += 10000000
- // orderNum += 10
- orderCode := CreateOutTradeNo(int64(playerId), int64(serverId), zoneId)
- fmt.Println(orderCode)
- }
- }
- // 随机不含重复字符的字符串
- // l长度 超过20需修改逻辑 命中会降低
- func RandString(l int) string {
- cl := len(charset)
- if l > cl || l <= 0 {
- return ""
- }
- bytes := make([]byte, l)
- selected := make(map[byte]bool)
- for i := 0; i < l; {
- b := rand.Intn(cl)
- char := charset[b]
- if !selected[char] {
- bytes[i] = char
- selected[char] = true
- i++
- }
- }
- return string(bytes)
- }
|