• 技术文章 >后端开发 >php教程

    生成短链接,php5.6可用,为什么php7生成不了?

    2016-06-06 20:15:53原创459
    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
    )

    这是哪的问题?

    回复内容:

    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
    )

    这是哪的问题?

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

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php php7
    上一篇:如何合并这个二维数组? 下一篇:像斗鱼,B站的聊天内容都存哪?
    PHP编程就业班

    相关文章推荐

    • HTML英文单词汇总(PHP新手收藏)• 我28了,还能不能学PHP?• CSS英文单词汇总(PHP新手收藏)• PHP英文单词汇总(PHP新手收藏)• ThinkPHP3.2 加载过程(2)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网