77 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			77 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package utility
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"github.com/rs/xid"
							 | 
						||
| 
								 | 
							
									"go.uber.org/zap"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									"fmt"
							 | 
						||
| 
								 | 
							
									"math"
							 | 
						||
| 
								 | 
							
									"math/rand"
							 | 
						||
| 
								 | 
							
									"time"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									log "github.com/go-admin-team/go-admin-core/logger"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// GetXid Package xid is a globally unique id generator library
							 | 
						||
| 
								 | 
							
								// 包xid是一个全局唯一的id生成器库
							 | 
						||
| 
								 | 
							
								func GetXid() string {
							 | 
						||
| 
								 | 
							
									return xid.New().String()
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// GetGuid 获取guid 基于时间戳和MAC地址的uuid 可以视为随机字符串
							 | 
						||
| 
								 | 
							
								//func GetGuid() string {
							 | 
						||
| 
								 | 
							
								//	return uuid.NewV1().String()
							 | 
						||
| 
								 | 
							
								//}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//var orderLock sync.Mutex
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// GetOrderNo 获取订单id 看样子已经废弃 改用采用雪花算法获取了
							 | 
						||
| 
								 | 
							
								//func GetOrderNo() string {
							 | 
						||
| 
								 | 
							
								//	orderLock.Lock()
							 | 
						||
| 
								 | 
							
								//	defer orderLock.Unlock()
							 | 
						||
| 
								 | 
							
								//	date := time.Now().Format("200601021504")
							 | 
						||
| 
								 | 
							
								//	code := fmt.Sprintf("%s%07d", date, time.Now().Nanosecond()/100)
							 | 
						||
| 
								 | 
							
								//	time.Sleep(30 * time.Millisecond)
							 | 
						||
| 
								 | 
							
								//	return code
							 | 
						||
| 
								 | 
							
								//}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// GetRandIntStr 生成len位的随机数字
							 | 
						||
| 
								 | 
							
								func GetRandIntStr(len int, prefix string) string {
							 | 
						||
| 
								 | 
							
									rand.Seed(time.Now().UnixNano())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									num := rand.Int31n(int32(math.Pow(10, float64(len))))
							 | 
						||
| 
								 | 
							
									x := fmt.Sprintf("%s%0*d", prefix, len, num)
							 | 
						||
| 
								 | 
							
									return x
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// GenerateRandString 生成指定位数的字符串
							 | 
						||
| 
								 | 
							
								// 虽然繁琐 但理解之后就觉得很精妙
							 | 
						||
| 
								 | 
							
								func GenerateRandString(length int) string {
							 | 
						||
| 
								 | 
							
									var chars = []byte(`ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789`) // 长度:(1,256)
							 | 
						||
| 
								 | 
							
									rand.Seed(time.Now().UnixNano())
							 | 
						||
| 
								 | 
							
									clen := len(chars)
							 | 
						||
| 
								 | 
							
									maxRb := 255 - (256 % clen) // [-1,255]  255 - (256%36) = 251  避免模偏倚 为了每个字符被取到的几率相等
							 | 
						||
| 
								 | 
							
									b := make([]byte, length)
							 | 
						||
| 
								 | 
							
									r := make([]byte, length+(length/4)) // storage for random bytes. 存储随机字节
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									for i := 0; ; {
							 | 
						||
| 
								 | 
							
										//  将随机的byte值填充到byte数组中 以供使用
							 | 
						||
| 
								 | 
							
										if _, err := rand.Read(r); err != nil {
							 | 
						||
| 
								 | 
							
											log.Error(`GenerateRandString`, zap.Error(err))
							 | 
						||
| 
								 | 
							
											return ``
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										for _, rb := range r {
							 | 
						||
| 
								 | 
							
											c := int(rb)
							 | 
						||
| 
								 | 
							
											if c > maxRb {
							 | 
						||
| 
								 | 
							
												// Skip this number to avoid modulo bias.跳过这个数字以避免模偏倚
							 | 
						||
| 
								 | 
							
												continue
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											b[i] = chars[c%clen]
							 | 
						||
| 
								 | 
							
											i++
							 | 
						||
| 
								 | 
							
											if i == length { // 直到取到合适的长度
							 | 
						||
| 
								 | 
							
												return string(b)
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |