- 新增随机字符串生成函数,支持不同模式(字母、数字、字母数字、字母十六进制) -重构 RandStringBytes 函数,使用新的随机字符串生成逻辑 - 添加 MakeTraceId 函数,用于生成追踪ID - 更新 Client 的 GetRefererHeader 方法,自动添加追踪ID
		
			
				
	
	
		
			117 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package utils
 | 
						|
 | 
						|
import (
 | 
						|
	"crypto/md5"
 | 
						|
	"crypto/rand"
 | 
						|
	"encoding/hex"
 | 
						|
	"fmt"
 | 
						|
	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/utils/random"
 | 
						|
	"hash"
 | 
						|
	"net/url"
 | 
						|
	"reflect"
 | 
						|
	"sort"
 | 
						|
	"strconv"
 | 
						|
	"strings"
 | 
						|
	"time"
 | 
						|
)
 | 
						|
 | 
						|
type UUID [16]byte
 | 
						|
 | 
						|
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
 | 
						|
 | 
						|
func GetUUID() (uuidHex string) {
 | 
						|
	uuid := NewUUID()
 | 
						|
	uuidHex = hex.EncodeToString(uuid[:])
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
func NewUUID() UUID {
 | 
						|
	ns := UUID{}
 | 
						|
	safeRandom(ns[:])
 | 
						|
	u := newFromHash(md5.New(), ns, RandStringBytes(16))
 | 
						|
	u[6] = (u[6] & 0x0f) | (byte(2) << 4)
 | 
						|
	u[8] = (u[8]&(0xff>>2) | (0x02 << 6))
 | 
						|
 | 
						|
	return u
 | 
						|
}
 | 
						|
 | 
						|
func RandStringBytes(n int) string {
 | 
						|
	return random.StrRandom(int64(n))
 | 
						|
}
 | 
						|
 | 
						|
func newFromHash(h hash.Hash, ns UUID, name string) UUID {
 | 
						|
	u := UUID{}
 | 
						|
	h.Write(ns[:])
 | 
						|
	h.Write([]byte(name))
 | 
						|
	copy(u[:], h.Sum(nil))
 | 
						|
 | 
						|
	return u
 | 
						|
}
 | 
						|
 | 
						|
func safeRandom(dest []byte) {
 | 
						|
	if _, err := rand.Read(dest); err != nil {
 | 
						|
		panic(err)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func GetUrlFormedMap(source map[string]string) (urlEncoded string) {
 | 
						|
	urlEncoder := url.Values{}
 | 
						|
	for key, value := range source {
 | 
						|
		urlEncoder.Add(key, value)
 | 
						|
	}
 | 
						|
	urlEncoded = urlEncoder.Encode()
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
func GetUrlByKeySort(source map[string]string) (url string) {
 | 
						|
	keys := make([]string, 0, len(source))
 | 
						|
	for k := range source {
 | 
						|
		keys = append(keys, k)
 | 
						|
	}
 | 
						|
	sort.Strings(keys)
 | 
						|
	for _, key := range keys {
 | 
						|
		url += fmt.Sprintf("%s=%s&", key, source[key])
 | 
						|
	}
 | 
						|
	return strings.TrimRight(url, "&")
 | 
						|
}
 | 
						|
 | 
						|
func InitStructWithDefaultTag(bean interface{}) {
 | 
						|
	beantype := reflect.TypeOf(bean)
 | 
						|
	for i := 0; i < beantype.Elem().NumField(); i++ {
 | 
						|
		field := beantype.Elem().Field(i)
 | 
						|
		defaultValue := strings.TrimSpace(field.Tag.Get("default"))
 | 
						|
		if defaultValue == "" || defaultValue == "-" {
 | 
						|
			continue
 | 
						|
		}
 | 
						|
		setter := reflect.ValueOf(bean).Elem().Field(i)
 | 
						|
		fieldTypeName := field.Type.String()
 | 
						|
		switch fieldTypeName {
 | 
						|
		case "int", "int64", "int32", "int8", "int16":
 | 
						|
			intval, _ := strconv.ParseInt(defaultValue, 10, 64)
 | 
						|
			setter.SetInt(intval)
 | 
						|
		case "uint", "uint8", "uint16", "uint32", "uint64", "uintptr":
 | 
						|
			uintval, _ := strconv.ParseUint(defaultValue, 10, 64)
 | 
						|
			setter.SetUint(uintval)
 | 
						|
		case "string":
 | 
						|
			setter.SetString(defaultValue)
 | 
						|
		case "time.Duration":
 | 
						|
			intval, _ := strconv.ParseInt(defaultValue, 10, 64)
 | 
						|
			setter.SetInt(intval * int64(time.Second))
 | 
						|
		case "bool":
 | 
						|
			boolval, _ := strconv.ParseBool(defaultValue)
 | 
						|
			setter.SetBool(boolval)
 | 
						|
		default:
 | 
						|
			fmt.Println(field.Type.String(), field.Name)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func Md5(data string) string {
 | 
						|
	s := md5.Sum([]byte(data))
 | 
						|
	return hex.EncodeToString(s[:])
 | 
						|
}
 | 
						|
 | 
						|
func MakeTraceId() string {
 | 
						|
	return fmt.Sprintf("00-%s-%s-01", random.Random(32, random.LetterHex), random.Random(16, random.LetterHex))
 | 
						|
}
 |