短网址ShortUrl的算法
场景:
我们在新浪微博上公布网址的时候。微博会自己主动判别网址。并将其转换。比如: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 )存储原始链接与短链接的映射关系就可以。当我们訪问短链接时,仅仅须要从映射关系中找到原始链接。就可以跳转到原始链接。
![](http://babyduncan.iteye.com/images/icon_star.png)
- import util.Encript;
- public class ShortUrl {
- public static void main(String[] args) {
- String url = "http://www.sunchis.com";
- for (String string : ShortText(url)) {
- print(string);
- }
- }
- public static String[] ShortText(String string){
- String key = "XuLiang"; //自己定义生成MD5加密字符串前的混合KEY
- String[] chars = new String[]{ //要使用生成URL的字符
- "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"
- };
- String hex = Encript.md5(key + string);
- int hexLen = hex.length();
- int subHexLen = hexLen / 8;
- String[] ShortStr = new String[4];
- for (int i = 0; i < subHexLen; i++) {
- String outChars = "";
- int j = i + 1;
- String subHex = hex.substring(i * 8, j * 8);
- long idx = Long.valueOf("3FFFFFFF", 16) & Long.valueOf(subHex, 16);
- for (int k = 0; k < 6; k++) {
- int index = (int) (Long.valueOf("0000003D", 16) & idx);
- outChars += chars[index];
- idx = idx >> 5;
- }
- ShortStr[i] = outChars;
- }
- return ShortStr;
- }
- private static void print(Object messagr){
- System.out.println(messagr);
- }
- }
![](http://babyduncan.iteye.com/images/icon_star.png)
- public class Encript {
- //十六进制下数字到字符的映射数组
- private final static String[] hexDigits = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
- /**把inputString加密*/
- public static String md5(String inputStr){
- return encodeByMD5(inputStr);
- }
- /**
- * 验证输入的password是否正确
- * @param password 真正的password(加密后的真password)
- * @param inputString 输入的字符串
- * @return 验证结果,boolean类型
- */
- public static boolean authenticatePassword(String password,String inputString){
- if(password.equals(encodeByMD5(inputString))){
- return true;
- }else{
- return false;
- }
- }
- /**对字符串进行MD5编码*/
- private static String encodeByMD5(String originString){
- if (originString!=null) {
- try {
- //创建具有指定算法名称的信息摘要
- MessageDigest md5 = MessageDigest.getInstance("MD5");
- //使用指定的字节数组对摘要进行最后更新,然后完毕摘要计算
- byte[] results = md5.digest(originString.getBytes());
- //将得到的字节数组变成字符串返回
- String result = byteArrayToHexString(results);
- return result;
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- return null;
- }
- /**
- * 轮换字节数组为十六进制字符串
- * @param b 字节数组
- * @return 十六进制字符串
- */
- private static String byteArrayToHexString(byte[] b){
- StringBuffer resultSb = new StringBuffer();
- for(int i=0;i<b.length;i++){
- resultSb.append(byteToHexString(b[i]));
- }
- return resultSb.toString();
- }
- //将一个字节转化成十六进制形式的字符串
- private static String byteToHexString(byte b){
- int n = b;
- if(n<0)
- n=256+n;
- int d1 = n/16;
- int d2 = n%16;
- return hexDigits[d1] + hexDigits[d2];
- }
- }
转载于:https://www.cnblogs.com/zhchoutai/p/7120614.html
短网址ShortUrl的算法相关推荐
- python 短网址_Python实现短网址ShortUrl的Hash运算实例讲解
本文实例讲述了Python实现短网址ShortUrl的Hash运算方法.分享给大家供大家参考.具体如下: shorturl实现常见的做法都是将原始Url存储到数据库,由数据库返回一个对应ID. 以下要 ...
- php 短网址的生成和还原原理
2019独角兽企业重金招聘Python工程师标准>>> 欢迎转载,转载请注明出处.本文地址:http://www.yi-yan-tang.com/article/85.html [转 ...
- 算法高级(38)-短网址(short URL)系统如何实现?
一.什么是短网址? 我们的URL地址常常会因为需要携带各式各样的参数,或者随着业务增长,变得越来越长.对于用户而言,过长的链接体验必然是不好的.这时候短网址就应用而生了,也称为短链接. 短网址,就是把 ...
- C#短网址压缩算法与短网址原理入门
C#如何实现url短地址? c# url短地址压缩算法与短网址原理的例子,详细介绍了短网址的映射算法,将长网址md5生成32位签名串,分为4段,每段8个字节,然后生成短网址,具体见文本实例. 短网址映 ...
- [PHP]如何用PHP实现还原短网址的真实地址的功能
常见的短网址都是通过 301 或 302 跳转的方式实现重定向到目标网站的,因此我们可以使用 PHP 的 curl_getinfo 来取得 header 中的重定向地址,也就是短网址对应的原始网址(嗯 ...
- php短地址重定向怎么获取地址参数,PHP还原短网址原链接 获取短网址跳转的原地址 获取301重定向原页面地址函数...
通常有些项目我们在遇到短网址的时候需要获取原地址当中的参数,短网址一般是使用301重定向的方式将访问重定向到新的页面上去,我们在页面的header 信息中可以获取到原链接地址,通过下面的PHP函数读取 ...
- PHP 实现“万能”的短网址还原
常见的短网址都是通过 301 或 302 跳转的方式实现重定向到目标网站的,因此我们可以使用 PHP 的 curl_getinfo 来取得 header 中的重定向地址,也就是短网址对应的原始网址(嗯 ...
- php单文件短链接,php实现的短网址算法分享
这篇文章主要介绍了php实现的短网址算法,理论上支持1,073,741,824个短网址,个人使用足够了,需要的朋友可以参考下 每个网址用6个字符代替,(6^32) 最多可以拥有1,073,741,82 ...
- [转载] URL短网址生成算法原理
参考链接: URL 短地址Shorteners及其Python中的API 2 短网址(Short URL),是在形式上比较短的网址,通过映射关系跳转到原有的长网址. 本文转自米扑博客:URL短网址生成 ...
最新文章
- [19/04/04-星期四] IO技术_CommonsIO(通用IO,别人造的轮子,FileUtils类 操作文件 IOUtilsl类 操作里边的内容 )...
- matlab GUI和simulink参数传递
- Luogu P2580 于是他错误的点名开始了 Trie树 字典树
- vs 正则表达式替换
- gitblit mysql_CentOS7安装MySQL、Tomcat和GitBlit记录
- wpf office 菜单_如何带回Office 2007中的旧菜单
- 互联网日报 | 苹果首款自研芯片M1亮相;酷派主动终止与小米专利侵权诉讼;橙心优选日订单破700万...
- NoSQL数据库--简介
- 高并发推荐系统架构设计实践
- zabbix-自定义键值监控网卡IN、OUT流量
- java 短信备份宝_Android实战教程第八篇之短信备份
- 阮一峰ES6学习-Symbol
- 洛谷P1510 精卫填海(简单的dp)
- redis安装和基本数据类型
- Python机器学习基础
- 滨州稻田绽放人生 国稻种芯·中国水稻节:山东盐碱地变良田
- 大直径测径仪的工艺流程详解
- Tomcat文件夹目录
- php请求和调用erp接口,调用详情 - 上海管易云ERP - 服务支持平台
- oracle10g配置远程连接