时间:2021-07-01 10:21:17 帮助过:20人阅读
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);