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)
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |