C++:检查字符串是不是是有效的 MD5 十六进制哈希

Posted

技术标签:

【中文标题】C++:检查字符串是不是是有效的 MD5 十六进制哈希【英文标题】:C++: Check if string is a valid MD5 hex hashC++:检查字符串是否是有效的 MD5 十六进制哈希 【发布时间】:2013-11-02 00:48:06 【问题描述】:

如何正确检查 std::string 是否是 C++ 上的有效 MD5 十六进制哈希?

请记住,我想避免循环,我不能使用 C++11 中的 boost 库和正则表达式。

【问题讨论】:

让我们尝试回答“什么是有效的 md5 哈希”? 你可以很容易地测试它是否是十六进制字符:测试它是否包含0-9A-F之外的任何字符。测试它是否专门是十六进制哈希似乎是不可行的。 @Barmar md5 哈希首先包含 128 位,可以通过可打印字符以不同方式表示,其中一个实际上是十六进制表示法,它使用 0-9a-fA-F 符号,所以任何 32 个字符带有这个符号的字符串可以被认为是“有效的 md5 哈希”,但我不确定 OP 是否需要它 您可以使用isxdigit 检查字符是否为有效的十六进制字符。您可以检查长度...通过检查长度。你还想要什么? 【参考方案1】:

这样就可以了:

if (value.size() == 32 && value.find_first_not_of("0123456789abcdefABCDEF") == -1)

或者由于 cluracan 在评论中提到了isxdigit,这可能会更快:

if (value.size() == 32 && std::find_if(value.begin(), value.end(), [](char c)  return !std::isxdigit(static_cast<unsigned char>(c)); ) == value.end())

【讨论】:

【参考方案2】:

请记住,MD5 是 128 位值,即 16 字节。为了方便人们,它通常写成 32char 十六进制字符串。

如果您不需要“查看”您的 md5 值 - 将其保留为 16 字节 - 这样您就不需要像 std::string 这样的花哨结构来存储它。只有 16 字节数组。您也不必验证它,因为您可以存储在 16 字节数组中的所有内容也是有效的 MD5 值;-)

【讨论】:

以上是关于C++:检查字符串是不是是有效的 MD5 十六进制哈希的主要内容,如果未能解决你的问题,请参考以下文章

如何检查字符串是不是是有效的十六进制颜色表示?

检查生成的许可证是不是有效

c++ isalpha 查找表

c++两个自然数(输入的十进制数转换为二进制时,两个数的位数相同。) 输出:有效则有效,无效则无效

如何验证 torrent Infohash 是不是有效?

如何检查科学记数法是不是加倍C++