检查字符串是否为MD5哈希

kmo*_*y12 42 php hash md5

我不小心在存储之前停止了散列密码,所以现在我的数据库混合了MD5密码和未散列的密码.

我想循环并散列不是MD5的那些.是否可以检查字符串是否是MD5哈希?

Nul*_*teя 96

您可以使用以下功能进行检查:

function isValidMd5($md5 ='')
{
    return preg_match('/^[a-f0-9]{32}$/', $md5);
}

echo isValidMd5('5d41402abc4b2a76b9719d911017c592');
Run Code Online (Sandbox Code Playgroud)

MD5(消息摘要算法)散列通常以文本格式表示为32位十六进制数.

此功能检查:

  1. 它只包含字母和数字(az,0-9).
  2. 它长32个字符.

  • 为什么你需要检查它是否为空?如果`preg_match()`不匹配,它会不会返回false? (5认同)
  • @hellohellosharp似乎没有人回答你的'准确性'评论:这个函数验证字符串是否为MD5哈希的格式,它不验证它*是*实际的哈希密码 - 无法确定.如果您的*未散列*密码之一满足格式要求,它也将返回true - 但这不太可能. (4认同)
  • @hellohellosharp是的,文档读取`返回哈希值为32个字符的十六进制数字.这意味着该值应该只包含`0-9`和`af`字符,它应该是32个字符长. (2认同)

Rap*_*elH 32

也许快一点:

function isValidMd5($md5 ='') {
  return strlen($md5) == 32 && ctype_xdigit($md5);
}
Run Code Online (Sandbox Code Playgroud)

  • @non:再一次,"e4bfb280c702635cf71d46a0c8c33b96"是100%有效的md5哈希,你不能确定它是否打算成为一个.如果是你的密码,那么它都是有效的md5和你的普通密码. (10认同)
  • @non:我不同意你的看法.您可以100%确定该字符串是有效的md5哈希.该字符串是否是一个有效的md5哈希是另一个点.. (4认同)
  • +1,可能比正则表达式更快,也更易读。对于大多数无效字符串,它可能会提前退出 strlen 调用,然后我怀疑 ctype_xdigit 调用比运行正则表达式引擎更快。 (2认同)