合法MD5字符串是32位十六进制小写字母与数字组成的字符串,仅含0-9、a-f字符,不区分大小写但惯例全小写,无前缀、空格或分隔符。

MD5字符串长什么样,先看标准格式
合法的MD5值是32位十六进制小写字母+数字组成的字符串,不区分大小写但惯例全小写,不含空格、前缀(如0x或md5:)、分隔符。它只是摘要结果的文本表示,和“是否由MD5算法生成”无关——你只能校验格式,不能反推来源。
- 必须恰好32个字符
- 每个字符必须属于
0123456789abcdef(允许大写,但建议统一转小写后再判断) - 不能是空串、
null、nullptr或未初始化内存
用std::string做长度和字符范围检查最直接
C++标准库没有内置“MD5格式验证”函数,得自己写逻辑。别用正则(小题大做且引入依赖),用遍历+查表或std::all_of更轻量:
bool is_valid_md5(const std::string& s) {
if (s.length() != 32) return false;
return std::all_of(s.begin(), s.end(), [](char c) {
return (c >= '0' && c <= '9') ||
(c >= 'a' && c <= 'f') ||
(c >= 'A' && c <= 'F');
});
}- 注意:
std::string::length()是 O(1),先判长度能快速过滤掉绝大多数非法输入 - 不要用
std::tolower遍历转换再比对,徒增开销;直接支持大小写更高效 - 如果输入可能含不可见字符(如BOM、控制符),这个检查也能捕获
从char*或C风格字符串判断时要防越界
传入 const char* 时,必须确保它非空且以 '<p>传入 <code>const char* 时,必须确保它非空且以 '\0' 结尾,否则 strlen 可能崩溃或误判:
strlen 可能崩溃或误判:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
bool is_valid_md5_cstr(const char* s) {
if (!s) return false;
size_t len = strlen(s);
if (len != 32) return false;
for (size_t i = 0; i < len; ++i) {
char c = s[i];
if (!((c >= '0' && c <= '9') ||
(c >= 'a' && c <= 'f') ||
(c >= 'A' && c <= 'F'))) {
return false;
}
}
return true;
}- 忘记判
!s是常见段错误源头 -
strlen本身会遍历到'\0',如果传入野指针或没结束符,行为未定义 - 不要用
std::string(s)包一层再调前面的函数——万一s不合法,构造就崩了
别把格式校验当成内容校验
is_valid_md5("d41d8cd98f00b204e9800998ecf8427e") 返回 true,但它只是空字符串的MD5,不代表业务上“有效”;同理,"00000000000000000000000000000000" 格式合法,但大概率不是真实计算出来的。
立即学习“C++免费学习笔记(深入)”;
- 格式正确 ≠ 值存在对应原文
- 格式正确 ≠ 该值在数据库里有记录
- 如果后续要查库或比对,务必单独做业务层校验,别指望格式函数背这个锅
真正容易被忽略的是:有人拿用户输入的哈希值去反查原文,却没确认这串字符是不是真出自MD5——比如前端传了 "sha256:abc..." 过来,后端只扫了一眼“长度32”,就当MD5处理了。这种错,光靠格式函数拦不住,得结合上下文协议约定。

















