生成短链接,php5.6可用,为什么php7生成不了?
ringa_lee
ringa_lee 2017-04-10 16:59:10
[PHP讨论组]
function shortUrl($long_url){
    $key = '123';
    $base32 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    // 利用md5算法方式生成hash值
    $hex = hash('md5', $long_url.$key);
    $hexLen = strlen($hex);
    $subHexLen = $hexLen / 8;

    $output = array();
    for($i=0;$i<$subHexLen;$i++){
        // 将这32位分成四份,每一份8个字符,将其视作16进制串与0x3fffffff(30位1)与操作
        $subHex = substr($hex, $i*8, 8);
        $idx = 0x3FFFFFFF & (1 * ('0x' . $subHex));

        // 这30位分成6段, 每5个一组,算出其整数值,然后映射到我们准备的62个字符
        $out = '';
        for($j=0;$j<6;$j++){
            $val = $idx & 0x0000003D;
            $out .= $base32[$val];
            $idx = $idx >> 5;
        }
        $output[$i] = $out;
    }
    // 生成位数
    return $output;

}


print_r( shortUrl('http://www.google.com/') );

php5.6输出结果为:

Array
(
    [0] => MVvIZz
    [1] => qURRjy
    [2] => U7rIzu
    [3] => JNNJbi
)

php7输出结果为:

Array
(
    [0] => aaaaaa
    [1] => aaaaaa
    [2] => aaaaaa
    [3] => aaaaaa
)

这是哪的问题?

ringa_lee
ringa_lee

ringa_lee

全部回复(1)
迷茫

问题主要出现在这句话上
$idx = 0x3FFFFFFF & (1 * ('0x' . $subHex));
因为在php7中,十六进制的字符串不再被认为是数字,所以这里所采用的隐式转换变成了无效转换,导致结果出现了问题。
可以将此句替换为
$idx = 0x3FFFFFFF & hexdec($subHex);

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号