转自:http://blog.csdn.net/wgw335363240/article/details/6568794

新浪、腾讯、搜狐等微博网站都加入了短链接的功能。之所以要是使用短链接,主要是因为微博只允许发140 字,如果链接地址太长的话,那么发送的字数将大大减少。短链接的主要职责就是把原始链接很长的地址压缩成只有6 个字母的短链接地址,当我们点击这6 个字母的链接后,我们又可以跳转到原始链接地址。

开始以为短链接是按照某种算法把原始链接压缩为短链接,再根据算法从短链接反算成原始链接的。后来尝试了下压缩算法(gzip 压缩算法),发现对于url 这种字符串越是压缩,长度就越长。通过对压缩算法的一些了解,发现靠压缩算法来实现这个功能不太靠谱。

后来在网上找到一个生成算法,该算法主要使用MD5 算法对原始链接进行加密(这里使用的MD5 加密后的字符串长度为32 位),然后对加密后的字符串进行处理以得到短链接的地址。原始的算法是C# 版本的,这里我把该算法修改成Java 版本的. 算法的具体代码如下,代码中有注释:

一、  代码

package com.csdn.shorturl;

public class ShortUrlGenerator {

/**

@param args

*/

public static void main(String[] args) {

// 长连接: http://tech.sina.com.cn/i/2011-03-23/11285321288.shtml

// 新浪解析后的短链接为: http://t.cn/h1jGSC

String sLongUrl = "http://tech.sina.com.cn/i/2011-03-23/11285321288.shtml" ; // 3BD768E58042156E54626860E241E999

String[] aResult = shortUrl (sLongUrl);

// 打印出结果

for int i = 0; i < aResult. length ; i++) {

System. out .println( "[" + i + "]:::" + aResult[i]);

}

}

public static String[] shortUrl(String url) {

// 可以自定义生成 MD5 加密字符传前的混合 KEY

String key = "wuguowei" ;

// 要使用生成 URL 的字符

String[] chars = new String[] { "a" , "b" , "c" , "d" , "e" , "f" , "g" , "h" ,

"i" , "j" , "k" , "l" , "m" , "n" , "o" , "p" , "q" , "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" ,

"I" , "J" , "K" , "L" , "M" , "N" , "O" , "P" , "Q" , "R" , "S" , "T" ,

"U" , "V" , "W" , "X" , "Y" , "Z"

};

// 对传入网址进行 MD5 加密

String sMD5EncryptResult = ( new CMyEncrypt()).getMD5OfStr(key + url);

String hex = sMD5EncryptResult;

String[] resUrl = new String[4];

for int i = 0; i < 4; i++) {

// 把加密字符按照 8 位一组 16 进制与 0x3FFFFFFF 进行位与运算

String sTempSubString = hex.substring(i * 8, i * 8 + 8);

// 这里需要使用 long 型来转换,因为 Inteper .parseInt() 只能处理 31 位 , 首位为符号位 , 如果不用long ,则会越界

long lHexLong = 0x3FFFFFFF & Long.parseLong (sTempSubString, 16);

String outChars = "" ;

for int j = 0; j < 6; j++) {

// 把得到的值与 0x0000003D 进行位与运算,取得字符数组 chars 索引

long index = 0x0000003D & lHexLong;

// 把取得的字符相加

outChars += chars[( int ) index];

// 每次循环按位右移 5 位

lHexLong = lHexLong >> 5;

}

// 把字符串存入对应索引的输出数组

resUrl[i] = outChars;

}

return resUrl;

}

}

二、  输出结果

执行上面代码的结果如下,会产生4 组6 位字符串,任意一组都可以作为当前字符串的短链接地址。

[0]:::7nUFJn

[1]:::f6Zzy2

[2]:::j6jmQb

[3]:::2eAjea

三、  跳转原理

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

转载于:https://www.cnblogs.com/assult/p/4169368.html

微博中的长链接与短链接相关推荐

  1. 长URL链接转短链接算法

    引言 很多大型网站都加入了短链接的功能.之所以要是使用短链接,主要是因为微博只允许发140 字,如果链接地址太长的话,那么发送的字数将大大减少.短链接的主要职责就是把原始链接很长的地址压缩成只有6 个 ...

  2. 如何把一个长链接变成短链接?

    如何把一个长链接变成短链接? 做运营.产品的小伙伴们都会碰到过这种苦恼问题,从微信公众号.活动落地页复制出来的链接又长又丑,无论是外部推广还是发至内部讨论测试都显得特别尴尬.其实,从技术层面上来讲,长 ...

  3. 什么是长连接和短连接?(长链接、短链接)什么时候使用长连接、短链接?

    文章目录 什么是长连接和短连接? 什么时候使用长连接.短链接? 定义 适用场景 什么是长连接和短连接? 在HTTP/1.0中默认使用短连接.也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连 ...

  4. http / 关于长连接和短链接的理解

    HTTP 协议是基于请求 / 响应模式的,因此只要服务端给了响应,本次 HTTP 请求就结束了,也可以理解成 HTTP 是面向请求 / 响应的. TCP 协议是面上连接的. 综上,如果 HTTP 请求 ...

  5. HTTP的长链接和短链接说明

    HTTP的长链接和短链接实际上是TCP的长连接和短链接.首先我们先介绍一下TCP/IP协议组四层模型.其中包括以下: 应用层:HTTP.FTP.DNS.TELNET等协议 传输层:TCP.UDP 网络 ...

  6. 【短链接】——新浪、百度、搜狐等官方长链接转短链接

    在项目中难免会生成自己的跳转链接,为了简化链接以及防止微信等屏蔽,可以用一些官方的api将自己的链接转为短链接. ConvertShortUrlUtil.java public class Conve ...

  7. 微信URL Scheme码+长链接转短链接+短链接通过h5页面跳转到微信小程序

    微信URL Scheme码+长链接转短链接+短链接通过h5页面跳转到微信小程序 --生成微信URL Scheme码-->长链接转换成短链接-->通过短信进行推广-->用户访问营销短信 ...

  8. php 长链接变为短链接,长链接转短链接原理

    长链接转短链接代码: function short_url($input = '', $salt = '') { $base62 = array ('a', 'b', 'c', 'd', 'e', ' ...

  9. 长链接转短链接java_新浪短网址API接口 - 长链接转短链接

    新浪短网址API接口是新浪对外公开的短网址生成接口,可以将长链接转短链接(生成的是 http://t.cn/xxxx 格式的),分享一个自己收藏的api接口,使用快一年了,一直都挺稳定的,觉得不错可以 ...

  10. Java把长链接变成短链接_借助第三方,java长链接转短链接,IP域名同样支持

    短信和微博中用到短链接,短链接的主要职责就是把原始链接很长的地址压缩成短链接地址,当点击这个链接后,又可以跳转到原始链接地址. package common.util; import java.uti ...

最新文章

  1. RDKit | 基于RDKit的氨基酸序列转换为SMILES
  2. C#学习路线:C#入门经典 -> CLR VIA C# -> WINDOWS核心编程
  3. 【DB2】NVL2函数
  4. PMCAFF推出咖啡日报 更多好内容等你来发现
  5. linux-文件目录类
  6. 前端学习(2818):小程序学习之新建页面
  7. 面向对象基础-委托与事件
  8. session和cookie的区别和联系,session的生命周期,多个服务部署时session管理
  9. 数据结构之广义表的相关知识点
  10. 12月中旬计算机会议,2019年12月泰国曼谷--深度学习与计算机视觉国际会议(DLCV 2019)...
  11. linux cat命令使用方法,Linux cat命令怎么使用
  12. luogu1969积木游戏
  13. 手机卫星定位系统_如何判断自己的手机是否支持北斗卫星定位功能,如何使用?...
  14. BNUOJ 52506 Captcha Cracker
  15. MTK处理器心路历程
  16. 渗透学什么?渗透测试中超全的提权思路来了!
  17. Lib之过?Java反序列化漏洞通用利用分析
  18. SAP CO模块的英文缩写
  19. UBUNTU 11.10 (32位)双网卡 NAT 实现局域网共享上网
  20. c语言 读取TXT 去空格,C语言读取TXT文件,忽略文件空格,把内容写入数组中应该如何实现...

热门文章

  1. python生成器的惰性计算
  2. [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之网格渲染器和过滤器Mesh renderers and filters...
  3. 开发问题及解决 java.lang.ClassCastException:android.widget.LinearLayout$LayoutParams
  4. spring security 使用 application/json 接收数据
  5. 移动端学习笔记(小强测试品牌学员作品)
  6. web前端炫酷特效-CSS3制作环形星星发光动画
  7. Dialog详解(包括进度条、PopupWindow、自定义view、自定义样式的对话框)
  8. please verify the preference field with the prompt:Tomcat JDK name
  9. UNIX/Linux RHEL6.3 root密码破解,GRUB加密(图文并茂)
  10. nosql笔记1_早前的时候