Dragon
国外主机测评国外主机测评  2019-08-22 10:20 国外主机测评 隐藏边栏  0 
文章评分 0 次,平均分 0.0

一直以来都是使用 32 位的 md5 码,最近有个需求是要用 16 位 md5 码,查了 php 官方手册,采用如下方式生成 md5 码,结果却返回乱码。

  $code = md5($str,true);//$code 是乱码

又仔细的看了眼手册,手册中关于第二个参数的描述是:如果可选的 raw_output 被设置为 TRUE,那么 MD5 报文摘要将以 16 字节长度的原始二进制格式返回。

而对于 md5 函数的默认返回值定义是:以 32 字符十六进制数字形式返回散列值。

也就是说,我们平时使用 md5 返回的是32 字节长度的十六进制数字形式,如果第二个参数设置为 true 返回的是16 字节长度的原始二进制格式。虽然有点绕口,但很显然两种返回格式是完全不同的,因此也就导致了乱码的产生。

解决方法有两种,一是将这个 16 字节的原始二进制格式码转为十六进制;二是采取截取的办法,因为一个值的 32 位 md5 码的第 8 到 24 位和 16 位 md5 的字符串是一样的。

附解决方法二代码:

  $code = substr(md5($str),8,16);//$code 是 16 位的 md5 码。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

扫一扫二维码分享