场景:

我们在新浪微博上公布网址的时候。微博会自己主动判别网址。并将其转换。比如:http://t.cn/hrYnr0。

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

1、微博限制字数为140字一条,那么假设我们须要发一些连接上去,可是这个连接很的长。以至于将近要占用我们内容的一半篇幅。这肯定是不能被同意的。所以短网址应运而生了。 



2、短网址能够在我们项目里能够非常好的对开放级URL进行管理。

有一部分网址能够会涵盖性、暴力、广告等信息。这样我们能够通过用户的举报,全然管理这个连接将不出如今我们的应用中,应为相同的URL通过加密算法之后,得到的地址是一样的。 



3、我们能够对一系列的网址进行流量,点击等统计,挖掘出大多数用户的关注点。这样有利于我们对项目的兴许工作更好的作出决策。

以下先来看看短网址映射算法的理论(网上找到的资料): 



① 将长网址用md5算法生成32位签名串,分为4段,,每段8个字符; 



② 对这4段循环处理,取每段的8个字符, 将他看成16进制字符串与0x3fffffff(30位1)的位与操作。超过30位的忽略处理。 



③ 将每段得到的这30位又分成6段,每5位的数字作为字母表的索引取得特定字符,依次进行获得6位字符串; 



④ 这样一个md5字符串能够获得4个6位串。取里面的随意一个就可作为这个长url的短url地址。

非常easy的理论,我们并不一定说得到的URL是唯一的。可是我们可以取出4组URL,这样差点儿不会出现太大的反复。

三、  跳转原理

当我们生成短链接之后。仅仅须要在表中(数据库或者NoSql )存储原始链接与短链接的映射关系就可以。当我们訪问短链接时,仅仅须要从映射关系中找到原始链接。就可以跳转到原始链接。

Java代码  
  1. import util.Encript;
  2. public class ShortUrl {
  3. public static void main(String[] args) {
  4. String url = "http://www.sunchis.com";
  5. for (String string : ShortText(url)) {
  6. print(string);
  7. }
  8. }
  9. public static String[] ShortText(String string){
  10. String key = "XuLiang";                 //自己定义生成MD5加密字符串前的混合KEY
  11. String[] chars = new String[]{          //要使用生成URL的字符
  12. "a","b","c","d","e","f","g","h",
  13. "i","j","k","l","m","n","o","p",
  14. "q","r","s","t","u","v","w","x",
  15. "y","z","0","1","2","3","4","5",
  16. "6","7","8","9","A","B","C","D",
  17. "E","F","G","H","I","J","K","L",
  18. "M","N","O","P","Q","R","S","T",
  19. "U","V","W","X","Y","Z"
  20. };
  21. String hex = Encript.md5(key + string);
  22. int hexLen = hex.length();
  23. ;
  24. ];
  25. ; i < subHexLen; i++) {
  26. String outChars = "";
  27. ;
  28. , j * 8);
  29. ) & Long.valueOf(subHex, 16);
  30. ; k < 6; k++) {
  31. ) & idx);
  32. outChars += chars[index];
  33. ;
  34. }
  35. ShortStr[i] = outChars;
  36. }
  37. return ShortStr;
  38. }
  39. private static void print(Object messagr){
  40. System.out.println(messagr);
  41. }
  42. }

Java代码  
  1. public class Encript {
  2. //十六进制下数字到字符的映射数组
  3. private final static String[] hexDigits = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
  4. /**把inputString加密*/
  5. public static String md5(String inputStr){
  6. return encodeByMD5(inputStr);
  7. }
  8. /**
  9. * 验证输入的password是否正确
  10. * @param password 真正的password(加密后的真password)
  11. * @param inputString 输入的字符串
  12. * @return 验证结果,boolean类型
  13. */
  14. public static boolean authenticatePassword(String password,String inputString){
  15. if(password.equals(encodeByMD5(inputString))){
  16. return true;
  17. }else{
  18. return false;
  19. }
  20. }
  21. /**对字符串进行MD5编码*/
  22. private static String encodeByMD5(String originString){
  23. if (originString!=null) {
  24. try {
  25. //创建具有指定算法名称的信息摘要
  26. MessageDigest md5 = MessageDigest.getInstance("MD5");
  27. //使用指定的字节数组对摘要进行最后更新,然后完毕摘要计算
  28. byte[] results = md5.digest(originString.getBytes());
  29. //将得到的字节数组变成字符串返回
  30. String result = byteArrayToHexString(results);
  31. return result;
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. return null;
  37. }
  38. /**
  39. * 轮换字节数组为十六进制字符串
  40. * @param b 字节数组
  41. * @return 十六进制字符串
  42. */
  43. private static String byteArrayToHexString(byte[] b){
  44. StringBuffer resultSb = new StringBuffer();
  45. ;i<b.length;i++){
  46. resultSb.append(byteToHexString(b[i]));
  47. }
  48. return resultSb.toString();
  49. }
  50. //将一个字节转化成十六进制形式的字符串
  51. private static String byteToHexString(byte b){
  52. int n = b;
  53. )
  54. +n;
  55. ;
  56. ;
  57. return hexDigits[d1] + hexDigits[d2];
  58. }
  59. }

短网址ShortUrl的算法的更多相关文章

  1. Java Net版短网址(ShortUrl)的算法及实现 待续

    算法 1)将长网址md5生成32位签名串,分为4段, 每段8个字节; 2)对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略处理; 3) ...

  2. URL短网址系统的算法设计及实践

    在通常情况下,URL是由系统生成的,通常包括URI路径,多个查询参数,可以对参数进行加密和解密.当人们要分享某个URL,比如短信,邮件,社交媒体,这就需要短URL. 而短网址,顾名思义就是在长度上比较 ...

  3. 用PHP实现URL转换短网址的算法示例

    短网址就是把一个长的地址转换在超级短的网址,然后访问短网址即可跳转到长网址了,下面来看用PHP实现URL转换短网址的算法与例子. 短网址(Short URL) ,顾名思义就是在形式上比较短的网址.在W ...

  4. 如何做系列(4)-微博URL短网址生成算法原理(java版、php版实现实例)

    短网址(Short URL),顾名思义就是在形式上比较短的网址.通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代 ...

  5. C#如何实现url短地址?C#短网址压缩算法与短网址原理入门

    c# url短地址压缩算法与短网址原理的例子,详细介绍了短网址的映射算法,将长网址md5生成32位签名串,分为4段,每段8个字节,然后生成短网址,具体见文本实例. 短网址映射算法: 将长网址md5生成 ...

  6. 长网址 短网址(http://www.zhihu.com/question/19852154?rf=21975802)

    短网址(Short URL),顾名思义就是在形式上比较短的网址.通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代 ...

  7. php实现的短网址算法分享

    这篇文章主要介绍了php实现的短网址算法,理论上支持1,073,741,824个短网址,个人使用足够了,需要的朋友可以参考下 每个网址用6个字符代替,(6^32) 最多可以拥有1,073,741,82 ...

  8. php短网址生成算法

    <?php //短网址生成算法 class ShortUrl { //字符表 public static $charset = "0123456789ABCDEFGHIJKLMNOPQ ...

  9. URL短网址生成算法原理和php实现案例

    短网址(Short URL),顾名思义就是在形式上比较短的网址. 短链接的好处:1.内容需要:2.用户友好:3.便于管理为什么要这样做的,原因我想有这样几点:微博限制字数为140字一条,那么如果我们需 ...

随机推荐

  1. 【iOS开发-27】解决方式:An error was encountered while running(Domain=FBSOpenApplicationErrorDomain, Code=4)

    iOS simulator出现故障,提示: An error was encountered while running (Domain = FBSOpenApplicationErrorDomain ...

  2. vue ---- 组件传值之间使用 v-model

    父子组件通信,都是单项的,很多时候需要双向通信.方法如下: 1.父组件使用:msg.sync="aa"  子组件使用$emit('update:msg', 'msg改变后的值xxx ...

  3. Js将类数组转化为数组

    说起伪数组,大家可能会想到arguments, 这个我们函数参数的一个类数组,是类数组的代表. 1.拥有length属性,可以使用下标来访问元素,这两点和数组相同. 2.不能使用数组的方法,他们不能使 ...

  4. #学习笔记#——JavaScript 数组部分编程(四)

    7.合并数组 arr1 和数组 arr2.不要直接修改数组 arr,结果返回新的数组 function concat(arr1, arr2) { return arr1.concat(arr2); } ...

  5. web api 特点

    webapi有很多特点(我不想用优点这个词),比如说restful,支持路由,简单,类似mvc controller/action的代码编写方式,灵活的托管方式,和web的集成等等. Web API的 ...

  6. spark network-common

    概述 Spark底层使用netty作为节点间通信的桥梁.其实现在common/network-common包中.common/network-common包主要是对netty进行了一层封装,主要是定义 ...

  7. ssh-agent && 及 ssh-add介绍

    ssh-agent命令是一种控制用来保存公钥身份验证所使用的私钥的程序.ssh-agent在X会话或登录会话之初启动,所有其他窗口或程序则以客户端程序的身份启动并加入到ssh-agent程序中.通过使 ...

  8. 【Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined) B】 Conan and Agasa play a Card Game

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 最大值出现次数是偶数. 那么就取次大值. 次大值也是偶数? =>再次 因为你绝对不能取偶数个的. 取了对方就总是能面对一个奇数 ...

  9. ln用法

    第一部分: 建立简单的硬连接: ln ./wwy.gif ./wwy_ln (第二个参数为新建的连接文件,建立前不存在),则任意一个文件变化,另一个也变化:大小为一个文件的大小:硬连接只能建在同一个分 ...

  10. poj3244(公式题)

    Difference between Triplets Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 2476   Acce ...