`
xyz_lmn
  • 浏览: 65372 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

URL短地址压缩算法 微博短地址原理解析 (Java实现)

 
阅读更多

最近,项目中需要用到短网址(ShortUrl)的算法,于是在网上搜索一番,发现有C#的算法,有.Net的算法,有PHP的算法,就是没有找到Java版的短网址(ShortUrl)的算法,很是郁闷。同时还发现有不少网友在发帖求助,怎么实现Java版的短网址(ShortUrl)的算法。干脆一不做,二不休,参考了一下网上比较流行的PHP版短网址(ShortUrl)算法:

再根据自己的理解,用Java实现了该短网址(ShortUrl)的算法。(\(^o^)/YES!我还真厉害!)

先来废话一下,是在别人的帖子上看到的,主要是让大家了解一下短网址(ShortUrl)。

时下,短网址应用已经在全国各大微博上开始流行了起来。例如QQ微博的url.cn,新郎的t.cn等。

我们在新浪微博上发布网址的时候,微博会自动判别网址,并将其转换,例如: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地址。

很简单的理论,我们并不一定说得到的URL是唯一的,但是我们能够取出4组URL,这样几乎不会出现太大的重复。

首先,请大家了解在Java中如何用MD5来加密字符串得到32位的加密后的字符串,下面是我已经封装好的Java MD5算法:

private final static String[] hexDigits = {
      "0", "1", "2", "3", "4", "5", "6", "7", 
      "8", "9", "a", "b", "c", "d", "e", "f"}; 

	public 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];
	}

	public static String MD5Encode(String origin){
		String resultString = null;
			try {
				
				resultString=new String(origin);
				MessageDigest md = MessageDigest.getInstance("MD5");
				
				resultString.trim();

				resultString=byteArrayToHexString(md.digest(resultString.getBytes("UTF-8")));
			}catch (Exception ex){}
			return resultString;
		}

	public static void main(String[] args) 
	{
	
		String data = "189022881112011111118:09sz0000123456789987654321";
		System.out.println(MD5Encode(data));
	}


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 = MD5Encode(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); 
    } 
} 


下面来看看程序部分:现在可以直接使用ShortText(url)方法,可以等到下面四组值:

ShortText("http://www.sunchis.com")[0];  //得到值:Jzyqma 
ShortText("http://www.sunchis.com")[1];  //得到值:QBrMzm 
ShortText("http://www.sunchis.com")[2];  //得到值:bQreM3 
ShortText("http://www.sunchis.com")[3];  //得到值:VNBRna 


选取结果中四个值的任何一个值即可作为URL对应生成的短网址了。

分享到:
评论

相关推荐

    福高(天津)Java程序算法面试题

    "福高(天津)Java程序算法面试题"这个标题表明这是一个与Java编程语言相关的面试问题集,特别关注的是算法方面。福高(天津)可能是一家公司在天津的分支机构,它对求职者的技术能力有较高的要求,尤其是Java编程和...

    JAVA技术实现的搜索引擎(含源码)Java实用源码整理learns

    在"jsymxx254.zip"这个压缩文件中,可能包含了实现以上部分的JAVA源代码。对于初学者,可以通过阅读源码了解搜索引擎的实现细节,包括数据结构的选择、算法的应用以及如何与网络交互。"下载及使用说明.txt"提供了...

    搜索源代码(JAVA实现)

    标题中的“搜索源代码(JAVA实现)”指的是使用Java编程语言实现的搜索引擎的相关代码。这通常涉及到网络爬虫、数据抓取、索引构建、查询处理和结果排序等多个方面。网络爬虫是搜索引擎的重要组成部分,它负责自动...

    JAVA上百实例源码以及开源项目源代码

    日历表格面板 [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接...

    网络蜘蛛程序及java源码

    对于压缩的网页,可能采用了gzip或deflate等压缩算法进行解码,这通常涉及到处理HTTP头中的Content-Encoding字段。Java内置的Inflater类可以用来解压deflate编码的数据,而GZIPInputStream则用于处理gzip格式的压缩...

    Java后端技术面试基础汇总

    ### Java后端技术面试基础汇总 #### 一、Java基础知识 **1.1 Java基础** - **面向对象的特征:** - 继承:子类可以继承父类的属性和方法。 - 封装:将数据和行为封装在一起,提高数据安全性。 - 多态:同一...

    Android 新浪微博图片缓冲技术.rar

    本压缩包包含的资源主要讲解了Android平台下实现新浪微博图片缓存的技术方案,让我们逐一解析其中的关键知识点。 首先,我们需要理解图片缓冲的原理。缓冲技术是为了避免频繁的网络请求,提高应用性能,减少用户...

    115网盘地址解析工具

    压缩包子文件的文件名称“115_Parse.exe”表明这是一个可执行文件,可能是用编程语言如C++、C#或Java编写的Windows应用程序。用户下载后,只需运行这个文件,就能启动解析工具,开始处理115网盘的链接。 在使用115...

    基于Java的手机与计算机互发彩信源码.zip

    同时,为了进一步提高程序的稳定性和用户体验,还应该考虑优化彩信的压缩算法、减少传输延迟以及处理不同设备和网络环境下的兼容性问题。 总之,通过Java实现手机与计算机间的彩信互发是一项涉及网络通信、多媒体...

    搭建自己的搜索引擎Java

    相关性计算涉及TF-IDF(词频-逆文档频率)、BM25等算法,这些算法可以在Lucene中实现。 7. **分布式搜索**:大型搜索引擎通常需要分布式处理能力。Hadoop和Spark等大数据处理框架可以配合Lucene进行分布式索引和...

    short-url:提供长链接转短网址功能

    总结来说,"short-url"项目是一个基于Java实现的短网址服务,它涉及到了URL处理、哈希映射、数据库操作、分布式服务、API设计等多个IT领域的知识点。通过研究这个项目,不仅可以掌握短网址服务的实现,还能加深对...

    java经典面试题

    20. **Java 多态的实现原理**: - 通过方法覆盖(重写)和方法重载来实现。 - 在运行时根据对象的实际类型来确定调用哪个方法。 21. **实现多线程的两种方法**: - 继承 `Thread` 类。 - 实现 `Runnable` 接口...

    JAVA文件传输毕设论文源代码程序

    标题 "JAVA文件传输毕设论文源代码程序" 涉及的是一个基于Java语言的毕业设计项目,专注于文件传输的功能实现。在这个项目中,学生可能已经深入研究了如何使用Java来构建一个能够发送和接收文件的系统,这可能是对...

    java面试题

    请用java写二叉树算法,实现添加数据形成二叉树功能,并以先序的方式打印出来. 119 84.12. 请写一个java程序实现线程连接池功能? 122 84.13. 编一段代码,实现在控制台输入一组数字后,排序后在控制台输出; 122 ...

    为网站添加搜索功能类似于在google里搜索自己的网站(java语言版)

    这个项目的目标是教你如何使用Java编程语言来实现一个自定义的搜索功能,使用户能够在你的网站上像在Google一样方便地搜索内容。这一功能不仅提升了用户体验,也提高了网站信息的可访问性。 【描述】:在实现这个...

    Java后端技术面试汇总-2019

    - **ConcurrentHashMap的工作原理及代码实现**:通过分段锁实现并发控制,使用CAS和volatile保证线程安全。 - **手写简单的HashMap**:实现基本的put和get方法,了解哈希函数和链表的使用。 - **看过那些Java集合...

    北京汉当科技有限公司Java笔试题

    这份试题可能会涵盖Java语言的基础知识、进阶特性、多线程、数据结构、算法以及Java应用开发的相关概念。 【描述分析】 描述部分同样简洁明了,仅重复了标题的信息,没有提供额外的具体内容。因此,我们可以推测,...

    Java后端面试题大纲(涵盖了百分之九十的考点).pdf

    - 输入URL后,首先解析域名获取IP地址。 - 建立TCP连接,发送HTTP请求。 - 服务器接收请求并返回响应。 - 浏览器解析HTML文档,下载资源。 2. **GET和POST请求的区别** - GET请求数据通过URL传输,适合查询...

    JAVA后端高级工程师面试题

    以上内容深入浅出地涵盖了Java后端高级工程师所需掌握的关键技能,包括Web性能调优策略、MVC架构的路由原理、系统的整体设计和技术选型以及JavaScript的核心特性——继承的实现方式。这些知识点不仅体现了一位优秀...

    transition-7.7.3.zip

    《基于Java的Douglas Crockford Base32实现解析与应用》 在IT行业中,编码和解码技术是数据传输和存储中不可或缺的部分。Base32作为一种常用的编码方式,广泛应用于URL安全、电子邮件地址和XML等场景。Douglas ...

Global site tag (gtag.js) - Google Analytics