Php 检查字符串是否为MD5哈希

Php 检查字符串是否为MD5哈希,php,hash,md5,Php,Hash,Md5,我不小心在存储密码之前就停止了散列,所以现在我的数据库混合了MD5密码和未被散列的密码 我想循环并散列那些不是MD5的。是否可以检查字符串是否为MD5哈希?您可以使用以下函数进行检查: function isValidMd5($md5 ='') { return preg_match('/^[a-f0-9]{32}$/', $md5); } echo isValidMd5('5d41402abc4b2a76b9719d911017c592'); MD5(消息摘要算法)散列通常以文本格

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


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

您可以使用以下函数进行检查:

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

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

此函数用于检查:

  • 它只包含字母和数字(a-f,0-9)
  • 它有32个字符长

  • 也许快一点:

    function isValidMd5($md5 ='') {
      return strlen($md5) == 32 && ctype_xdigit($md5);
    }
    

    !空的
    检查在那里是完全多余的。为什么需要检查它是否为空?如果
    preg_match()
    不匹配,它是否已经返回false?如果不匹配,它将返回0,与
    false
    同义+投票@inhan@hellohellosharp是 啊文档读取时,
    以32个字符的十六进制数返回哈希值。
    这意味着该值应仅由
    0-9
    a-f
    字符组成,且长度应为32个字符。@hellohellosharp似乎还没有人回答您的“准确性”注释:此函数验证字符串的格式是否正确对于MD5散列,它不会验证它是否是实际的散列密码,这是无法确定的。如果其中一个未保存的密码满足格式要求,它也将返回true,但这不太可能。NullPointer的响应是您的最佳选择,但您仍然无法确定,除非您已经允许用户保存一个32个字符长的密码。主题外,但MD5被视为“已损坏”用于存储密码,因为您可以轻松计算所有可能的密钥。看看:and+1,可能比正则表达式更快,也更可读。对于大多数无效字符串,它可能会在strlen调用中提前退出,然后我怀疑ctypexdigit调用比运行正则表达式引擎更快。@non:我不同意你的看法。您可以100%确定该字符串是有效的md5哈希。字符串是否打算成为有效的md5散列是另一个问题。@non:再次,“e4bfb280c702635cf71d46a0c8c33b96”表示100%有效的md5散列,您无法确定它是否打算成为有效的md5散列。如果它是您的密码,那么它是有效的md5和普通密码。是的,您不能100%确定它是md5字符串。要做到这一点,您需要使用:
    !ctype_digit($md5)和&ctype_lower($md5)和&ctype_alpha($md5)
    @VeeeneX回答可能有点晚,但您建议的是完全bs,我想澄清一下。我假设md5哈希的表示形式是十六进制字符串,这里的其他所有人都是这样做的。它可以而且大部分都包含数字,所以!ctype_数字错误。它不必是小写的,所以ctype_lower是错误的,而大写散列没有任何错误。它不能有超过f的字符,所以ctype_alpha是错误的。