[瞎扯]如何写一个短网址程序

乱七八糟 无标签

前言

短网址常见的http://t.cn/xxxxx或者http://url.cn/xxxxx,我也闲的蛋疼,也来造轮子.....
本文纯属瞎扯,我还是推荐大家使用 yourls 统计什么的都有...

瞎扯

算法

常用的短网址算法大概有3种...
1.62进制法
将id转换位62进制。比如第一个xxx.xx/1,第二个xxx.xx/2,第100个xxx.xx/1C。用这个的很方便,批量插入不会怎么耗时。缺点:不太安全,通过生成规律就能找到其他的长网址。平常使用无所谓...

function touid($num) {
    $to = 62;
    $dict = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $ret = '';
    while($num>0){
        $ret = $dict[bcmod($num, $to)] . $ret;
        $num = bcdiv($num, $to);
    }
    return $ret;
}

2.随机数
随机生成以为6(7,8)位的字符串,再在数据库里查询这个字符串有没有对应的短网址,如果没有就使用插入。优点:不容易给别人找到其他的长网址。缺点:查询耗时,当数据库大的时候,添加比较慢(我用这种方法,数据库有15万数据,批量插入的时候500条一分钟[查询数据库需要0.12s]),个人使用还行,批量插入就会比较慢了。机器的性能也有稍微影响查询速度...

function shorturl(){
    $str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    $short="";
    for($i=0;$i<8;$i++){
        $short.=$str[rand(0,strlen($str)-1)];
    }
    return $short;
}

$uid=shorturl();
$res=$db->query("select * from snow where uid='$uid'");
while($resrow=$res->fetch()){
    $uid=shorturl();
    $res=$db->query("select * from snow where uid='$uid'");
}

3.网上的md5算法??!
这个方法可能会碰撞,我就没用了。

跳转

这个有301和302,其实都可以,统计数据就用302,不统计就用301。

数据库

新建一个表,5个字段吧,id、uid、longurl、ip、ttime。记录id、短网址、长网址、ip和生成时间(防止恶意使用,那就把ip记上把。)
长网址推荐用正则表达式过滤后,用base64加密存储。

短网址

这个就是域名+/字符串了,使用伪静态把后面那个字符串传到php某个文件上,比如go.php?uid=xxxxx。再在数据库查询。

注意

防止sql注入,xss,csrf等安全漏洞。

大概也就这样了吧,嗯,又水了一篇文章

0条评论