fix
Some checks failed
部署后端服务 / 🧪 测试后端 (push) Failing after 5m8s
部署后端服务 / 🚀 构建并部署 (push) Has been skipped
部署后端服务 / 🔄 回滚部署 (push) Has been skipped

This commit is contained in:
xujiang
2025-07-10 18:09:11 +08:00
parent 35004f224e
commit 010fe2a8c7
96 changed files with 23709 additions and 19 deletions

View File

@ -0,0 +1,77 @@
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]
}