场景:

我们在新浪微博上公布网址的时候。微博会自己主动判别网址。并将其转换。比如: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. Erlang简单并行server

    Erlang简单并行服务器 (金庆的专栏) Erlang并行服务器为每一个Tcp连接创建相应的连接进程,处理client数据. 參考 Erlang程序设计(第2版)17.1.3 顺序和并行服务器 并行 ...

  2. Android资源推荐

    Intellj IDEA 安装配置 使用IntelliJ IDEA 13搭建Android集成开发环境(图文教程) Android设计指南站点 图标 App Icon Template免费的Photo ...

  3. Apache shiro 笔记整理之web整合一

    下面内容是在看了涛哥的<跟我一起学shiro> 和 视频<一头扎入进shiro> 后整理出来备忘和方便自己和其它人学习. 个人主页:http://www.itit123.cn/ ...

  4. 智课雅思词汇---三、aud和auto和bene是什么意思

    智课雅思词汇---三.aud和auto和bene是什么意思 一.总结 一句话总结:aud:听 auto:自己,self bene:good,well 1.anthropo是什么意思? anthropo ...

  5. 55.npm install 报错 :stack Error: Can't find Python executable "python"

    转自:https://www.cnblogs.com/zengry/p/8044379.html 解决方法 : 1. 安装python , 设置环境变量 :cmd --> path='%path ...

  6. es6 ----- export 和 import

    ES6 模块不是对象,而是通过export命令显式指定输出的代码,再通过import命令输入. 下面列出几种import和export的基本语法: 第一种方式: 在lib.js文件中, 使用 expo ...

  7. solr简介

    Solr 是什么? Solr它是一种开放源码的.基于 Lucene Java 的搜索服务器,易于加入到 Web 应用程序中. Solr 提供了层面搜索(就是统计).命中醒目显示并且支持多种输出格式(包 ...

  8. 《Java设计模式》之桥接模式

    Bridge模式的概念 Bridge 模式是构造型的设计模式之中的一个.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任.它的主要特点是把抽象(abst ...

  9. HDU 2563 统计问题 (递推)

    A - 统计问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Sta ...

  10. unity3d编程日志

    2014/4/27 编写脚本的时候,加入了中文凝视,发现console面板有非常多不可思议的bug.查了一下发现是由于monodevelop脚本中文凝视报错,而英文凝视不会受影响. 解决方法:把凝视放 ...