golang 生成定单号的操作
程序员文章站
2022-03-24 09:00:06
年(2位)+一年中的第几天(3位)+指定位数随机数//生成单号//06123xxxxx//sum 最少10位,sum 表示全部单号位数func makeyeardaysrand(sum int) st...
年(2位)+一年中的第几天(3位)+指定位数随机数
//生成单号 //06123xxxxx //sum 最少10位,sum 表示全部单号位数 func makeyeardaysrand(sum int) string { //年 strs := time.now().format("06") //一年中的第几天 days := strconv.itoa(getdaysinyearbythisyear()) count := len(days) if count < 3 { //重复字符0 days = strings.repeat("0", 3-count) + days } //组合 strs += days //剩余随机数 sum = sum - 5 if sum < 1 { sum = 5 } //0~9999999的随机数 ran := getrand() pow := math.pow(10, float64(sum)) - 1 //fmt.println("sum=>", sum) //fmt.println("pow=>", pow) result := strconv.itoa(ran.intn(int(pow))) count = len(result) //fmt.println("result=>", result) if count < sum { //重复字符0 result = strings.repeat("0", sum-count) + result } //组合 strs += result return strs } //年中的第几天 func getdaysinyearbythisyear() int { now := time.now() total := 0 arr := []int{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} y, month, d := now.date() m := int(month) for i := 0; i < m-1; i++ { total = total + arr[i] } if (y%400 == 0 || (y%4 == 0 && y%100 != 0)) && m > 2 { total = total + d + 1 } else { total = total + d } return total; }
补充:基于go语言实现的支持高并发订单号生成函数
1.固定24位长度订单号,毫秒+进程id+序号。
2.同一毫秒内只要不超过一万次并发,则订单号不会重复。
github地址:
package ordernum import ( "fmt" "github.com/w3liu/go-common/constant/timeformat" "os" "sync/atomic" "time" ) var num int64 //生成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 }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
上一篇: 数据结构:使用链栈实现回文判断
下一篇: 详解Java的桥接方法