最近,项目中需要用到短网址(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编程和...
在"jsymxx254.zip"这个压缩文件中,可能包含了实现以上部分的JAVA源代码。对于初学者,可以通过阅读源码了解搜索引擎的实现细节,包括数据结构的选择、算法的应用以及如何与网络交互。"下载及使用说明.txt"提供了...
标题中的“搜索源代码(JAVA实现)”指的是使用Java编程语言实现的搜索引擎的相关代码。这通常涉及到网络爬虫、数据抓取、索引构建、查询处理和结果排序等多个方面。网络爬虫是搜索引擎的重要组成部分,它负责自动...
日历表格面板 [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接...
对于压缩的网页,可能采用了gzip或deflate等压缩算法进行解码,这通常涉及到处理HTTP头中的Content-Encoding字段。Java内置的Inflater类可以用来解压deflate编码的数据,而GZIPInputStream则用于处理gzip格式的压缩...
### Java后端技术面试基础汇总 #### 一、Java基础知识 **1.1 Java基础** - **面向对象的特征:** - 继承:子类可以继承父类的属性和方法。 - 封装:将数据和行为封装在一起,提高数据安全性。 - 多态:同一...
本压缩包包含的资源主要讲解了Android平台下实现新浪微博图片缓存的技术方案,让我们逐一解析其中的关键知识点。 首先,我们需要理解图片缓冲的原理。缓冲技术是为了避免频繁的网络请求,提高应用性能,减少用户...
压缩包子文件的文件名称“115_Parse.exe”表明这是一个可执行文件,可能是用编程语言如C++、C#或Java编写的Windows应用程序。用户下载后,只需运行这个文件,就能启动解析工具,开始处理115网盘的链接。 在使用115...
同时,为了进一步提高程序的稳定性和用户体验,还应该考虑优化彩信的压缩算法、减少传输延迟以及处理不同设备和网络环境下的兼容性问题。 总之,通过Java实现手机与计算机间的彩信互发是一项涉及网络通信、多媒体...
相关性计算涉及TF-IDF(词频-逆文档频率)、BM25等算法,这些算法可以在Lucene中实现。 7. **分布式搜索**:大型搜索引擎通常需要分布式处理能力。Hadoop和Spark等大数据处理框架可以配合Lucene进行分布式索引和...
总结来说,"short-url"项目是一个基于Java实现的短网址服务,它涉及到了URL处理、哈希映射、数据库操作、分布式服务、API设计等多个IT领域的知识点。通过研究这个项目,不仅可以掌握短网址服务的实现,还能加深对...
20. **Java 多态的实现原理**: - 通过方法覆盖(重写)和方法重载来实现。 - 在运行时根据对象的实际类型来确定调用哪个方法。 21. **实现多线程的两种方法**: - 继承 `Thread` 类。 - 实现 `Runnable` 接口...
标题 "JAVA文件传输毕设论文源代码程序" 涉及的是一个基于Java语言的毕业设计项目,专注于文件传输的功能实现。在这个项目中,学生可能已经深入研究了如何使用Java来构建一个能够发送和接收文件的系统,这可能是对...
请用java写二叉树算法,实现添加数据形成二叉树功能,并以先序的方式打印出来. 119 84.12. 请写一个java程序实现线程连接池功能? 122 84.13. 编一段代码,实现在控制台输入一组数字后,排序后在控制台输出; 122 ...
这个项目的目标是教你如何使用Java编程语言来实现一个自定义的搜索功能,使用户能够在你的网站上像在Google一样方便地搜索内容。这一功能不仅提升了用户体验,也提高了网站信息的可访问性。 【描述】:在实现这个...
- **ConcurrentHashMap的工作原理及代码实现**:通过分段锁实现并发控制,使用CAS和volatile保证线程安全。 - **手写简单的HashMap**:实现基本的put和get方法,了解哈希函数和链表的使用。 - **看过那些Java集合...
这份试题可能会涵盖Java语言的基础知识、进阶特性、多线程、数据结构、算法以及Java应用开发的相关概念。 【描述分析】 描述部分同样简洁明了,仅重复了标题的信息,没有提供额外的具体内容。因此,我们可以推测,...
- 输入URL后,首先解析域名获取IP地址。 - 建立TCP连接,发送HTTP请求。 - 服务器接收请求并返回响应。 - 浏览器解析HTML文档,下载资源。 2. **GET和POST请求的区别** - GET请求数据通过URL传输,适合查询...
以上内容深入浅出地涵盖了Java后端高级工程师所需掌握的关键技能,包括Web性能调优策略、MVC架构的路由原理、系统的整体设计和技术选型以及JavaScript的核心特性——继承的实现方式。这些知识点不仅体现了一位优秀...
《基于Java的Douglas Crockford Base32实现解析与应用》 在IT行业中,编码和解码技术是数据传输和存储中不可或缺的部分。Base32作为一种常用的编码方式,广泛应用于URL安全、电子邮件地址和XML等场景。Douglas ...