密码大于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之间,这个是如何确定的?

回复内容:

生成一个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中文网,转载请注明出处,感谢您的尊重!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值