【PHP】PHP md5函数第二个参数为 true 时显示乱码以及乱码的由来

起序:这要因为一道 Web 题说起,那是一个月黑风高的白天…

一、程序展示

话不多说,先展示一下使用 md5()ffifdyop 字符串加密之后,第二个参数为 true|false 不同的结果:

<?php
    
    highlight_file(__FILE__);
    
    echo '<br >';
    $str = "ffifdyop";
    echo md5($str, true);
    echo '<br >';
    echo md5($str, false);

?>

在这里插入图片描述

二、函数解释

php 手册md5() 函数的表示:可以看出 md5() 函数的第二个参数默认是 false(不区分大小写)。

md5( string $str[, bool $raw_output = FALSE] ) : string

$raw_outputtrue|false 的含义:不是很好理解,就是返回的结果形式不同。

  • $raw_output = FALSE:以 32 字符十六进制数字形式返回散列值;
  • $raw_output = TRUE:以16字节长度的原始二进制格式返回。

三、乱码的由来

这个时候可能会有疑问,当 $raw_output = TRUE 输出的乱码是怎么来的呢?来,咱们解释一下。

  1. 使用 md5("ffifdyop", true) 加密之后,会得到 32 位 16进制 的字符串,和 $raw_output = FALSE 输出的结果一样:276f722736c95d99e921722cf9ed621c,但是还没完;
  2. 32 位 16进制 字符串按照两两为一组,分割成 16 组 16进制 的字符串:27,6f,72,27,36,c9,5d,99,e9,21,72,2c,f9,ed,62,1c
  3. 将每一组 16进制 的数值转换成为 2进制 数值:
    10011111011111110010100111110110110010011011101100110011110100110000111100101011001111100111101101110001011100
  4. 将每一组 2进制 数值转换成为 10进制 数值:39,111,114,39,54,201,93,153,233,33,114,44,249,237,98,28
  5. 最后和 ASCII 码表 进行对照可翻译出最终的原始二进制字符串。

在这里插入图片描述

四、解决方式

解决方式有下面两种,网上大多数文章只写出第二种解决方式,对第一种就说说。

  1. 对输出的 16字节长度的原始二进制 转化为 16 进制
  2. md5() 函数加密之后的密文中,16 位密文32 位密文8 - 23 位 子字符串是一样的,所以我们就可以通过 字符串截取 的方式:substr(md5($str), 8, 16)

substr() 函数解释:这里只介绍 $start$length 都是正数的时候,当然也是可以为负数,这里不做细讲,可以看 php 手册

# $string: 输入的字符串
# $start: 截取的起始位置,从 0 开始计算
# $length: 截取的长度
substr( string $string, int $start[, int $length] ) : string

1、第一种:转化

  • 害,太忙了,先留着。

2、第二种:截取

这是在 站长之家 测试 md5 16 位 和 32 位的比较,可以看出这之间的异同。

在这里插入图片描述

PHP 代码 表示:

<?php
    
    highlight_file(__FILE__);
	
	echo '<br >';
    $str = "ffifdyop";
	
	function md5_16($str){
		return substr(md5($str), 8, 16);
	}
	echo md5_16($str);
    echo '<br >';
    echo md5($str);

?>

在这里插入图片描述
如果对您有帮助,点个赞再走吧。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

边扯边淡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值