短网址的原理与生成方法(Java实现)

  

短网址应用已经在全国各大微博上开始流行了起来,例如QQ微博的url.cn,新郎的sinaurl.cn等。

  

我们在QQ微博上发布网址的时候,微博会自动判别网址,并将其转换,例如:http://url.cn/2hytQx

  

为什么要这样做的,原因我想有这样几点:

  
      <李>微博限制字数为140字一条,那么如果我们需要发一些连接上去,但是这个连接非常的长,以至于将近要占用我们内容的一半篇幅,这肯定是不能被允许的,所以短网址应运而生了。   <李>短网址可以在我们项目里可以很好的对开放级URL进行管理。有一部分网址可以会涵盖色情,暴力,广告等信息,这样我们可以通过用户的举报,完全管理这个连接将不出现在我们的应用中,应为同样的URL通过加密算法之后,得到的地址是一样的。   <李>我们可以对一系列的网址进行流量,点击等统计,挖掘出大多数用户的关注点,这样有利于我们对项目的后续工作更好的作出决策。
      李   
  

其实以上三点纯属个人观点,因为在我接下来的部分项目中会应用的到,所以就了解了一下,下面先来看看短网址映射算法的理论(网上找到的资料):

  
      <李>将长网址md5生成32位签名串,分为4段,每段8个字节;李   <李>对这四段循环处理,取8个字节,将他看成16进制串与0 x3fffffff(30位1)与操作,即超过30位的忽略处理,李   <李>这30位分成6段,每5位的数字作为字母表的索引取得特定字符,依次进行获得6位字符串;李   <李>总的md5串可以获得4个6位串;取里面的任意一个就可作为这个长url的短url地址;
      李   
  

很简单的理论,我们并不一定说得到的URL是唯一的,但是我们能够取出4组URL,这样几乎不会出现太大的重复。

  

下面来看看程序部分:

        公共静态string [] ShortUrl(字符串url)   {//可以自定义生成MD5加密字符传前的混合键   字符串键=癓eejor”;//要使用生成URL的字符   string[]识字课=new string [] {   “a”、“b”、“c”,“d”,“e”,“f”,“g”,“h”,   “我”、“j”、“k”、“l”、“米”、“n”,“o”,“p”,   “问”、“r”、“s”、“t”,“u”、“v”,“w”,“x”,   “y”、“z”、“0”、“1”、“2”、“3”、“4”、“5”,   “6”、“7”、“8”,“9”,“A”、“B”,“C”,“D”,   “E”、“F”、“G”,“H”,“我”、“J”,“K”、“L”,   “M”、“N”、“O”,“P”、“问”、“R”、“S”、“T”,   “U”、“V”、“W”,“X”,“Y”、“Z”   };//对传入网址进行MD5加密   十六进制=System.Web.Security.FormsAuthentication字符串。HashPasswordForStoringInConfigFile(键+ url, md5);      string [] resUrl=新的字符串[4];      for (int i=0;我& lt;4;我+ +)   {//把加密字符按照8位一组16进制与0 x3fffffff进行位与运算   int hexint=0 x3fffffff,转换。ToInt32 (0 x +十六进制。Substring(我* 8、8)、16);   字符串outChars=string.Empty;   for (int j=0;j & lt;6;j + +)   {//把得到的值与0 x0000003d进行位与运算,取得字符数组字符索引   int指数=0 x0000003d,hexint;//把取得的字符相加   outChars +=字符(指数);//每次循环按位右移5位   hexint=hexint祝辞祝辞5;   }//把字符串存入对应索引的输出数组   resUrl[我]=outChars;   }   返回resUrl;   }      

现在可以直接使用该方法,可以等到下面四组值:

        ShortUrl (http://www.me3.cn) [0];//得到值fAVfui   ShortUrl (http://www.me3.cn) [1];//得到ayqry值3   ShortUrl (http://www.me3.cn) [2];//得到值UZzyUr   ShortUrl (http://www.me3.cn) [3];//得到值36 rqzn      

在存放这个URL的数据方面,我个人推荐TTServer,有的朋友可以没有听说过,下面是这个数据库的介绍:

  

东京内阁是日本人Mikio Hirabayashi(平林幹雄)のページ开发的一款DBM数据库(注:大名鼎鼎的DBM数据库qdbm就是他开发的),该数据库读写非常快.insert: 0.4秒/1000000纪录(2500000每秒),写100年入万数据只需要0.4秒.search: 0.33秒/1000000纪录(3000000每秒),读取100年万数据只需要0.33秒。

  

可以看到对于字典类型的数据键/值的查询,这个数据库可以说是我目前见过效率非常高的,况且他如此的小巧,用来对短url/长url的配对再好不过。

  

该系统使用6个短码字符来表示任何长度的网址。有效的字符代码是ASCII“A”到“Z”和“0”的“5”,其中每个字符包含2 ^ 5(32)状态只6短码字符可用于绘制32 ^ 6(1073741824)的网址

短网址的原理与生成方法(Java实现)