快速业务通道

网址缩短程序是怎么做的

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-22

近来微博很火,因为字数的限制,出现了很多网址缩短这种服务,比如sina 自己用了自家的sinaurl.cn,想到自己曾经也注册了一个很短的域名k6.hk很久 了,一直闲着,不知道干嘛用,突然想到可以用来做网址缩短,还不错。说干就 干,一会就写好了。比如我的博客地址就可以缩短成:http://k6.hk/u 

程序的设计很简单,下面说下原理,

数据库只有两个字段seq(自增长数字)和url(数字的url地址,建立索引)。

用户输入一个url地址,查询表是否包含此url,如果存在,则返回seq的数字 ,

如果不存在,则插入数据库,得到一个新增加的自增seq数字,为了缩短数字 占用的字符数,我们可以把abc等字母的大小写用上。这样10个数字,26个小写 字母,26个大小字母就组成了一个62进制了。比如数字10000000000(100亿)转换 后就是aUKYOA,只有6位了,这样就能缩短很多的网址了。

下面是php的进制转换代码,来源于php手册(简单吧),当然其他语言实现也是很简单的,

<?php
//十进制转到其他制
function dec2any( $num, $base=62, $index=false ) {
   if (! $base ) {
     $base = strlen( $index );
   } else if (! $index ) {
     $index = substr ( "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" , 0 ,$base );
   }
   $out = "";
   for ( $t = floor( log10( $num ) / log10( $base ) );  $t >= 0; $t-- ) {
     $a = floor( $num / pow( $base, $t ) );
     $out = $out . substr( $index, $a, 1 );
     $num = $num - ( $a * pow( $base, $t ) );
   }
   return $out;
}
function any2dec( $num, $base=62, $index=false ) {
   if (! $base ) {
     $base = strlen( $index );
   } else if (! $index ) {
     $index = substr ( "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",  0, $base );
   }
   $out = 0;
   $len = strlen( $num ) - 1;
   for ( $t = 0; $t <= $len; $t++ ) {
     $out = $out + strpos( $index, substr( $num, $t, 1  ) ) * pow( $base, $len - $t );
   }
   return $out;
}
?>

上面只是说了下实现的原理,如果要大规模的使用,后端可以抛弃数据,用 key-value数据库存储,比如ttserver,将会有很高的性能提升。

如果改下ttserver的源代码,通过ttserver的http接口直接跳转,那么性能 将会非常高,一台机器一天提供上10亿次的中专都不是问题。用两台机器就可以 实现高可用了,这种服务都不怎么耗费流量的。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号