文档章节

【转】一个短URL生成算法

山哥
 山哥
发布于 2015/11/24 17:07
字数 358
阅读 116
收藏 13
import java.security.MessageDigest;

public class UrlUtils {

	private final static String[] HEX_DIGITS = { "0", "1", "2", "3", "4", "5","6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
	private final static String[] SURL_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" };
	
	static String byteArrayToHexString(byte[] b) {
		StringBuilder resultSb = new StringBuilder();
		for (int i = 0; i < b.length; i++) {
			resultSb.append(byteToHexString(b[i]));
		}
		
		return resultSb.toString();
	}

	static String byteToHexString(byte b) {
		int n = b;
		if (n < 0) {
			n = 256 + n;
		}
		int d1 = n / 16;
		int d2 = n % 16;
		
		return HEX_DIGITS[d1] + HEX_DIGITS[d2];
	}

	static String md5Encode(String origin) {
		String resultStr = null;
		try {
			resultStr = new String(origin).trim();
			MessageDigest md = MessageDigest.getInstance("MD5");
			resultStr = byteArrayToHexString(md.digest(resultStr.getBytes("UTF-8")));
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		
		return resultStr;
	}

	/**
	 * @param key 自定义生成MD5加密字符串前的混合KEY
	 * @param url 需要转换短URL的地址
	 * @return 为url生成四个短URL字符
	 */
	public static String[] shortUrl(String key, String url) {
		if(key == null || url == null)
		{
			throw new IllegalArgumentException("shortUrl(String key, String url) need param `key` and `url`!");
		}
		
		String hex = md5Encode(key + url);
		int hexLen = hex.length();
		int subHexLen = hexLen / 8;
		
		String[] shortUrls = new String[4];
		StringBuilder outChars = new StringBuilder();
		
		for (int i = 0; i < subHexLen; i++) {
			outChars.delete(0, outChars.length());
			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.append(SURL_CHARS[index]);
				idx = idx >> 5;
			}
			
			shortUrls[i] = outChars.toString();
		}

		return shortUrls;
	}

	public static void main(String[] args) {
	    String url = "http://www.oschina.net/question/59519_82623";   
            for (String string : shortUrl("test_key", url)) {   
               System.out.println(string); 
            }
            
            // maEJju
            // AjmIja
            // NNjQJz
            // uaUnYv
	}

}





本文转载自:http://blog.csdn.net/xyz_lmn/article/details/8057270

山哥

山哥

粉丝 248
博文 355
码字总数 136865
作品 0
南京
程序员
私信 提问
微薄短地址的实现-python

几乎所有的微薄都提供了缩短网址的服务,其原理就是将一个url地址按照一定的算法生成一段字符串,然后加在一个短域名后面边成了一个新的url地址,数 据库中会存放这个短地址和原始的地址,当...

java-苦苦甜甜
2012/11/22
203
1
微博URL短网址生成算法原理及(java版、php版实现实例)

短网址(Short URL),顾名思义就是在形式上比较短的网址。通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流。目前已经有许多类似服务,借助短网址您可以用简短的网址替代...

小老傅
2014/08/20
3.9K
5
微博短链接的生成算法(Java版本)

微博短链接的生成算法(Java 版本) 最近看到微博的短链接真是很火啊,新浪、腾讯、搜狐等微博网站都加入了短链接的功能。之所以要是使用短链接,主要是因为微博只允许发140 字,如果链接地址太...

java-苦苦甜甜
2012/11/22
522
3
TinyFramework/urlshorter

#urlshorter 首先我要说,开源托管,必须得 @红薯 家的。 上一次本人写过一篇博客《长URL转短连接的简单设计与实现》,由于写得比较仓促,是缺少设计的,因此方案也是不完整的,看到大家非常...

TinyFramework
2018/11/22
0
0
微博短链接解析ShortUrl【PHP代码实现】

一、背景简介 短网址应用已经在各大微博上开始流行了起来。例如QQ微博的url.cn,新浪的sinaurl.cn等。我们在QQ微博上发布网址的时候,微博会自动判别网址,并将其转换,例如:http://url.cn...

幸福的猫猫
2013/03/07
874
1

没有更多内容

加载失败,请刷新页面

加载更多

EDI 电子数据交换全解指南

EDI(Electronic Data Interchange,电子数据交换)技术使得企业与企业(B2B)实现通信自动化,帮助交易伙伴和组织更快更好地完成更多工作,并消除了人工操作带来的错误。从零售商到制造商、物...

EDI知行软件
今天
3
0
CentOS7的LVM动态扩容

# 问题 CentOS7上面的磁盘空间有点紧张,需要扩容。 解决 查询当前磁盘状态 [root@xxx ~]# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTfd0 2:0 1 4K ...

亚林瓜子
今天
5
0
Kafka 0.8 Producer (0.9以前版本适用)

Kafka旧版本producer由scala编写,0.9以后已经废除 示例代码如下: import kafka.producer.KeyedMessage;import kafka.javaapi.producer.Producer;import kafka.producer.ProducerConfig;......

实时计算
今天
5
0
Giraph源码分析(八)—— 统计每个SuperStep中参与计算的顶点数目

作者|白松 目的:科研中,需要分析在每次迭代过程中参与计算的顶点数目,来进一步优化系统。比如,在SSSP的compute()方法最后一行,都会把当前顶点voteToHalt,即变为InActive状态。所以每次...

数澜科技
今天
6
0
Navicat 快捷键

操作 结果 ctrl+q 打开查询窗口 ctrl+/ 注释sql语句 ctrl+shift +/ 解除注释 ctrl+r 运行查询窗口的sql语句 ctrl+shift+r 只运行选中的sql语句 F6 打开一个mysql命令行窗口 ctrl+l 删除一行 ...

低至一折起
今天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部