php - 16位md5压缩为8位字符串算法疑惑
本文介绍了php - 16位md5压缩为8位字符串算法疑惑的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
生成一个8位的随机字符串
function make_coupon_card() {
$code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$rand = $code[rand(0,25)]
.strtoupper(dechex(date('m')))
.date('d').substr(time(),-5)
.substr(microtime(),2,5)
.sprintf('%02d',rand(0,99));
for(
$a = md5( $rand, true ),
$s = '0123456789ABCDEFGHIJKLMNOPQRSTUV',
$d = '',
$f = 0;
$f < 8;
$g = ord( $a[ $f ] ),
$d .= $s[ ( $g ^ ord( $a[ $f + 8 ] ) ) - $g & 0x1F ],
$f++
);
return $d;
}
对于( $g ^ ord( $a[ $f + 8 ] ) ) - $g & 0x1F 的按位异或 减去本身 再进行的与运算,最终的范围是0-31之间,这个是如何确定的?
解决方案
( $g ^ ord( $a[ $f + 8 ] ) ) - $g & 0x1F
简而言之有个关键点,运算符-
的优先级要比&
高。
所以整体来看应该是( ( $g ^ ord( $a[ $f + 8 ] ) ) - $g )
和0x1F
进行与运算,
而0x1F
就是十进制的31
,取与的结果范围就限定在了0 - 31
之间。
这篇关于php - 16位md5压缩为8位字符串算法疑惑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文