你如何在PHP中使用md5()的raw_output返回值?

时间:2011-10-18 17:32:43

标签: php md5

我对PHP缺乏经验,所以这对你们中的一些人来说可能是显而易见的,但是如果我在PHP中调用md5($ mystring,true),它会返回“长度为16的原始二进制格式”。那是什么?它是一个阵列吗?一阵什么?如何读取该返回值的各个位和字节?

我在网上找到的所有例子都没有直接进入base64_encode()或其他东西。我只想检查第五位或第三位,例如。

5 个答案:

答案 0 :(得分:3)

var_dump(md5("string", TRUE));

“原始二进制格式”表示字符串(因为字符串在PHP中是二进制安全的):

string(16) "�\����= �(��^{!"

如果要读取其中的一个字节,请使用$string[5]偏移语法。或者从第五个字节中提取一个比特,例如:

$bit4_from_5th_byte = ord($result[5]) & (1 << 4);

答案 1 :(得分:1)

它将其作为“字符串”返回,每个字符都是输出的一个字节。您可能会考虑使用md5()的十六进制输出而不使用第二个参数,并使用intval()将其子串转换为数字,并将16作为基本参数。像这样:

$hash = md5($raw);
$byte = intval(substr($hash, 0, 2), 16);

答案 2 :(得分:1)

MD5哈希值是128位数,例如16字节的原始二进制数据。为了易读,PHP的md5()函数默认将其输出为人类可读的字符串,其中这16个二进制字节被转换为32个字符的字母数字字符串。

当您为MD5指定第二个true参数时,您告诉PHP返回原始的128位数而不是人类可读的版本。

答案 3 :(得分:1)

MD5的RAW输出是散列的普通二进制字符串。您无法将其打印到屏幕,因为它不是编码为实际的ASCII字符而是二进制数字。这仅在您需要以二进制格式存储或传输哈希时才有用。

答案 4 :(得分:1)

获取单个位:

$md5 = md5( "b", true );
$l = strlen( $md5 );
$bits = "";

    for( $i = 0; $i < $l; ++$i ) {
    $num = ord( $md5[$i] );
        for( $j = 7; $j >= 0; --$j ) {
        $bits .= ( $num & ( 1 << $j ) ) ? "1" : "0";
        }

    }

echo $bits."\n";

//10010010111010110101111111111110111001101010111000101111111011000011101011010111000111000111011101110101001100010101011110001111

echo asciibin2hex( $bits ) == md5("b"); // true

所以我们逐字节地去,因为它是字符串形式,我们需要通过ord()将它转换为ASCII数。现在逐位浏览字节,看看哪些是打开的,哪些是关闭的,并连接到位串。转到下一个字节并冲洗并重复,直到读取所有128位。

在第三个字节中读取第三位(从左侧开始):

ord( $md5[2] ) & ( 1 << ( 8 - 3 ) )
如果该位打开,

返回1,否则返回0