<code>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> 5; } $output[$i] = $out; } // 生成位数 return $output;}print_r( shortUrl('http://www.google.com/') );</code>
php5.6输出结果为:
<code>Array( [0] => MVvIZz [1] => qURRjy [2] => U7rIzu [3] => JNNJbi)</code>
php7输出结果为:
<code>Array( [0] => aaaaaa [1] => aaaaaa [2] => aaaaaa [3] => aaaaaa)</code>
这是哪的问题?
回复内容:
<code>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> 5; } $output[$i] = $out; } // 生成位数 return $output;}print_r( shortUrl('http://www.google.com/') );</code>
php5.6输出结果为:
<code>Array( [0] => MVvIZz [1] => qURRjy [2] => U7rIzu [3] => JNNJbi)</code>
php7输出结果为:
<code>Array( [0] => aaaaaa [1] => aaaaaa [2] => aaaaaa [3] => aaaaaa)</code>
这是哪的问题?
问题主要出现在这句话上$idx = 0x3FFFFFFF & (1 * ('0x' . $subHex));
¥本文来%源[email protected]搞@^&代*@码)网5搞gaodaima代码因为在php7
中,十六进制的字符串不再被认为是数字
,所以这里所采用的隐式转换变成了无效转换,导致结果出现了问题。
可以将此句替换为$idx = 0x3FFFFFFF & hexdec($subHex);