package utils import ( "crypto/rand" "encoding/base64" "math/big" "time" ) const ( // 字符集 alphanumeric = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" numbers = "0123456789" ) // GenerateRandomString 生成指定长度的随机字符串 func GenerateRandomString(length int) string { return generateRandomFromCharset(length, alphanumeric) } // GenerateRandomLetters 生成指定长度的随机字母字符串 func GenerateRandomLetters(length int) string { return generateRandomFromCharset(length, letters) } // GenerateRandomNumbers 生成指定长度的随机数字字符串 func GenerateRandomNumbers(length int) string { return generateRandomFromCharset(length, numbers) } // generateRandomFromCharset 从指定字符集生成随机字符串 func generateRandomFromCharset(length int, charset string) string { result := make([]byte, length) charsetLen := big.NewInt(int64(len(charset))) for i := 0; i < length; i++ { randomIndex, err := rand.Int(rand.Reader, charsetLen) if err != nil { // 如果加密随机数生成失败,回退到时间种子 return generateRandomFallback(length, charset) } result[i] = charset[randomIndex.Int64()] } return string(result) } // generateRandomFallback 回退的随机生成方法 func generateRandomFallback(length int, charset string) string { // 使用时间作为种子的简单随机生成 seed := time.Now().UnixNano() result := make([]byte, length) for i := 0; i < length; i++ { seed = seed*1103515245 + 12345 result[i] = charset[(seed/65536)%int64(len(charset))] } return string(result) } // GenerateSecureToken 生成安全令牌 func GenerateSecureToken(length int) (string, error) { bytes := make([]byte, length) if _, err := rand.Read(bytes); err != nil { return "", err } return base64.URLEncoding.EncodeToString(bytes), nil } // GenerateID 生成唯一ID func GenerateID() string { timestamp := time.Now().UnixNano() random := GenerateRandomString(8) return base64.URLEncoding.EncodeToString([]byte(string(timestamp) + random))[:16] }