随着互联网技术的发展,越来越多的网站采用短链接,将长网址转化为短链接,方便用户使用,并且会提高网站的安全性和速度。本文将介绍采用php实现的短网址算法。
短网址的实现流程是:将长网址转化为短网址,用户点击短网址时将短网址还原成长网址,实现原理如下:
短网址中字符有62个(a-z、A-Z、0-9),因此在将数字转换成62进制字符时,需要将12位的数字拆成6组,每组2位,以a-z、A-Z、0-9的顺序逐个选取一个字符,这样就得到了6个字符,作为短网址的一部分。最后将6个字符拼接起来,作为短网址输出。
下面采用php语言实现短网址算法。代码分为两个部分:长网址转化为短网址的函数和短网址还原成长网址的函数。
3.1 长网址转化为短网址
<?php
function shorturl($url)
{
// 要进行处理的网址
$url = md5($url);
$url_short = array();
$url_len = strlen($url);
for ($i = 0; $i < 4; $i++) {
$sub_str = substr($url, $i * 8, 8);
$url_short[$i] = 0x3FFFFFFF & (1 * hexdec($sub_str));
}
$result = array();
for ($i = 0; $i < 6; $i++) {
$index = 0x0000003D & $url_short[$i];
$result[] = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'[$index];
}
return implode('', $result);
}
?>
该函数的参数为长网址,返回值为短网址。
3.2 短网址还原为长网址
<?php
function longurl($url_short)
{
$url_short = str_split($url_short);
$url_len = count($url_short);
$url = array();
for ($i = 0; $i < $url_len; $i++) {
if ($url_short[$i] >= '0' && $url_short[$i] <= '9') {
$url[] = ord($url_short[$i]) - 48;
} else if ($url_short[$i] >= 'a' && $url_short[$i] <= 'z') {
$url[] = ord($url_short[$i]) - 87;
} else if ($url_short[$i] >= 'A' && $url_short[$i] <= 'Z') {
$url[] = ord($url_short[$i]) - 29;
} else {
return false;
}
}
$num10 = $url[0] * 56800235584 + $url[1] * 916132832 + $url[2] * 14776336 + $url[3] * 238328 + $url[4] * 3844 + $url[5] * 62;
$result = sprintf("%u", $num10);
$md5 = substr(md5($result), 0, 8);
$result = 'http://www.domain.com/' . $md5;
return $result;
}
?>
该函数的参数为短网址,返回值为长网址。
使用本文提供的php代码,可以将任意长的网址转化为6位的短网址,如下:
<?php
$long_url = 'http://www.domain.com/longlonglonglonglonglong';
$short_url = shorturl($long_url);
// 返回的值为 x2km8M
?>
还原短网址为长网址的过程如下:
<?php
$short_url = 'x2km8M';
$long_url = longurl($short_url);
// 返回的值为 http://www.domain.com/longlonglonglonglonglong
?>
以上是采用php实现的短网址算法分享。在短网址生成和还原的过程中,需要注意url_short数组的处理,以及其中数字的转换。