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:
@@ -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 {
|
fn generate_class_code() -> String {
|
||||||
// UUID v7 毫秒级时间戳前缀在紧凑循环中可能重复
|
const CHARSET: &[u8] = b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
||||||
// 取后 6 位(随机部分)而非前 6 位(时间戳部分)
|
let bytes = *Uuid::now_v7().as_bytes();
|
||||||
Uuid::now_v7()
|
let mut code = String::with_capacity(6);
|
||||||
.to_string()
|
// UUID v7: bytes[0..8] = 时间戳, bytes[8..16] = 随机部分
|
||||||
.replace("-", "")
|
// 从随机部分取 6 个字节,避免同毫秒碰撞
|
||||||
.chars()
|
for i in 0..6 {
|
||||||
.rev()
|
code.push(CHARSET[(bytes[8 + i] as usize) % CHARSET.len()] as char);
|
||||||
.take(6)
|
}
|
||||||
.collect::<String>()
|
code
|
||||||
.chars()
|
|
||||||
.rev()
|
|
||||||
.collect()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// school_class::Model -> ClassResp
|
/// school_class::Model -> ClassResp
|
||||||
|
|||||||
Reference in New Issue
Block a user