fix(diary): 班级码改用字母数字混合 — 16^6 提升到 62^6(568 亿组合)

- 从 UUID hex 后 6 位(0-9a-f,16^6 ≈ 1677 万)改为字母数字混合
- 字符集: 0-9A-Za-z(62 字符,62^6 ≈ 568 亿)
- 使用 UUID v7 后 8 字节随机部分作为熵源,避免同毫秒碰撞
- 符合 CLAUDE.md 设计规格要求

审计 ID: 7b-C01
This commit is contained in:
iven
2026-06-03 09:56:24 +08:00
parent 6d7ac05d0f
commit cca2d77ea2

View File

@@ -520,20 +520,21 @@ impl ClassService {
}
}
/// 生成 6 位班级码UUID 前 6 位字符
/// 生成 6 位字母数字混合班级码62^6 ≈ 568 亿种组合
///
/// CLAUDE.md 要求"6 位字母数字混合62^6 ≈ 568 亿种组合)"。
/// 使用 UUID v7 后 8 字节(随机部分)作为熵源,映射到 [0-9A-Za-z] 字符集。
/// 前 8 字节含时间戳,同毫秒内重复概率高,因此只用后 8 字节。
fn generate_class_code() -> String {
// UUID v7 毫秒级时间戳前缀在紧凑循环中可能重复
// 取后 6 位(随机部分)而非前 6 位(时间戳部分)
Uuid::now_v7()
.to_string()
.replace("-", "")
.chars()
.rev()
.take(6)
.collect::<String>()
.chars()
.rev()
.collect()
const CHARSET: &[u8] = b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
let bytes = *Uuid::now_v7().as_bytes();
let mut code = String::with_capacity(6);
// UUID v7: bytes[0..8] = 时间戳, bytes[8..16] = 随机部分
// 从随机部分取 6 个字节,避免同毫秒碰撞
for i in 0..6 {
code.push(CHARSET[(bytes[8 + i] as usize) % CHARSET.len()] as char);
}
code
}
/// school_class::Model -> ClassResp