微博中的长链接与短链接
转自: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
微博中的长链接与短链接相关推荐
- 长URL链接转短链接算法
引言 很多大型网站都加入了短链接的功能.之所以要是使用短链接,主要是因为微博只允许发140 字,如果链接地址太长的话,那么发送的字数将大大减少.短链接的主要职责就是把原始链接很长的地址压缩成只有6 个 ...
- 如何把一个长链接变成短链接?
如何把一个长链接变成短链接? 做运营.产品的小伙伴们都会碰到过这种苦恼问题,从微信公众号.活动落地页复制出来的链接又长又丑,无论是外部推广还是发至内部讨论测试都显得特别尴尬.其实,从技术层面上来讲,长 ...
- 什么是长连接和短连接?(长链接、短链接)什么时候使用长连接、短链接?
文章目录 什么是长连接和短连接? 什么时候使用长连接.短链接? 定义 适用场景 什么是长连接和短连接? 在HTTP/1.0中默认使用短连接.也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连 ...
- http / 关于长连接和短链接的理解
HTTP 协议是基于请求 / 响应模式的,因此只要服务端给了响应,本次 HTTP 请求就结束了,也可以理解成 HTTP 是面向请求 / 响应的. TCP 协议是面上连接的. 综上,如果 HTTP 请求 ...
- HTTP的长链接和短链接说明
HTTP的长链接和短链接实际上是TCP的长连接和短链接.首先我们先介绍一下TCP/IP协议组四层模型.其中包括以下: 应用层:HTTP.FTP.DNS.TELNET等协议 传输层:TCP.UDP 网络 ...
- 【短链接】——新浪、百度、搜狐等官方长链接转短链接
在项目中难免会生成自己的跳转链接,为了简化链接以及防止微信等屏蔽,可以用一些官方的api将自己的链接转为短链接. ConvertShortUrlUtil.java public class Conve ...
- 微信URL Scheme码+长链接转短链接+短链接通过h5页面跳转到微信小程序
微信URL Scheme码+长链接转短链接+短链接通过h5页面跳转到微信小程序 --生成微信URL Scheme码-->长链接转换成短链接-->通过短信进行推广-->用户访问营销短信 ...
- php 长链接变为短链接,长链接转短链接原理
长链接转短链接代码: function short_url($input = '', $salt = '') { $base62 = array ('a', 'b', 'c', 'd', 'e', ' ...
- 长链接转短链接java_新浪短网址API接口 - 长链接转短链接
新浪短网址API接口是新浪对外公开的短网址生成接口,可以将长链接转短链接(生成的是 http://t.cn/xxxx 格式的),分享一个自己收藏的api接口,使用快一年了,一直都挺稳定的,觉得不错可以 ...
- Java把长链接变成短链接_借助第三方,java长链接转短链接,IP域名同样支持
短信和微博中用到短链接,短链接的主要职责就是把原始链接很长的地址压缩成短链接地址,当点击这个链接后,又可以跳转到原始链接地址. package common.util; import java.uti ...
最新文章
- RDKit | 基于RDKit的氨基酸序列转换为SMILES
- C#学习路线:C#入门经典 -> CLR VIA C# -> WINDOWS核心编程
- 【DB2】NVL2函数
- PMCAFF推出咖啡日报 更多好内容等你来发现
- linux-文件目录类
- 前端学习(2818):小程序学习之新建页面
- 面向对象基础-委托与事件
- session和cookie的区别和联系,session的生命周期,多个服务部署时session管理
- 数据结构之广义表的相关知识点
- 12月中旬计算机会议,2019年12月泰国曼谷--深度学习与计算机视觉国际会议(DLCV 2019)...
- linux cat命令使用方法,Linux cat命令怎么使用
- luogu1969积木游戏
- 手机卫星定位系统_如何判断自己的手机是否支持北斗卫星定位功能,如何使用?...
- BNUOJ 52506 Captcha Cracker
- MTK处理器心路历程
- 渗透学什么?渗透测试中超全的提权思路来了!
- Lib之过?Java反序列化漏洞通用利用分析
- SAP CO模块的英文缩写
- UBUNTU 11.10 (32位)双网卡 NAT 实现局域网共享上网
- c语言 读取TXT 去空格,C语言读取TXT文件,忽略文件空格,把内容写入数组中应该如何实现...
热门文章
- python生成器的惰性计算
- [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之网格渲染器和过滤器Mesh renderers and filters...
- 开发问题及解决 java.lang.ClassCastException:android.widget.LinearLayout$LayoutParams
- spring security 使用 application/json 接收数据
- 移动端学习笔记(小强测试品牌学员作品)
- web前端炫酷特效-CSS3制作环形星星发光动画
- Dialog详解(包括进度条、PopupWindow、自定义view、自定义样式的对话框)
- please verify the preference field with the prompt:Tomcat JDK name
- UNIX/Linux RHEL6.3 root密码破解,GRUB加密(图文并茂)
- nosql笔记1_早前的时候