Files
photography/backend/internal/utils/random.go
xujiang 39a42695d3 refactor: 重构后端架构为 go-zero 框架,优化项目结构
主要变更:
- 采用 go-zero 框架替代 Gin,提升开发效率
- 重构项目结构,API 文件模块化组织
- 将 model 移至 api/internal/model 目录
- 移除 common 包,改为标准 pkg 目录结构
- 实现统一的仓储模式,支持配置驱动数据库切换
- 简化测试策略,专注 API 集成测试
- 更新 CLAUDE.md 文档,提供详细的开发指导

技术栈更新:
- 框架: Gin → go-zero v1.6.0+
- 代码生成: 引入 goctl 工具
- 架构模式: 四层架构 → go-zero 三层架构 (Handler→Logic→Model)
- 项目布局: 遵循 Go 社区标准和 go-zero 最佳实践
2025-07-10 15:05:52 +08:00

77 lines
2.1 KiB
Go

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