我们知道在用php编程的时候,如果我们需要计算一个字符串的md5哈希,只需要调用md5()函数就可以实现了。
其实md5()函数还有第二个参数,只是我们在编程的时候一般不会使用到,第二个参数有两个取值,TRUE和FALSE
我们平时使用的时候第二个参数都是默认为FALSE,然后会输出32字符的16进制数字
如果我们将第二个参数设置为FALSE的话,会输出16进制的原始二进制
但是当我们将md5函数第二个参数设置为TRUE的时候,我们会发现,字符串经过md5函数后会输出乱码:

1
2
3
<?php
$a = md5("a",TRUE);
echo $a;

运行结果:

明明说好的输出16位原始二进制,那么为什么会输出乱码呢?
看到网上的一种解释是这样的:
md5算法会输出128bits
在php中以16个字符形式输出时,每个字符由8bit二进制表示
而ascii编码方式是每7位二进编码位一个字符
ascii中0~32和127都是不可见字符
如果ascii大于127,将和下一个二进制组成双字节编码,就会出现各种奇怪的汉字,也就是我们说的乱码。
而129到247之外的二进制是没有编码汉字的,因此不会一起组成双字节编码,而是会分开显示,大于127的会显示为?

就比如我们将上面输出的乱码:

1
�u���1�iw&a

转为ascii码:

1
65533;117;65533;65533;65533;49;217;65533;105;119;38;97

我们可以看到对应关系:

1
2
3
4
5
6
7
8
9
10
11
12
� => 65533
u => 117
� => 65533
� => 65533
� => 65533
1 => 49
Ù => 217
� => 65533
i => 105
w => 119
& => 38
a => 97

× 请我吃糖~
打赏二维码