短链接生成算法与MD5生成32位唯一ID算法

首先将一个MD5生成32位id的算法。 

算法的核心就是通过java的MessageDigest工具类将给定的字符串转换为一个length=16的byte数组。  然后遍历改byte数组, 依次取出每个byte,取该byte的绝对值, 然后转换为16进制格式字符串,如果长度不够2位,就前面补0  ,  然后将这些字符串相加, 最后得到32位的一个字符串 。 

代码如下:

import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;


public class MD5Builder {

	public static String build(String origin ,String charsetName){
		if(origin == null )
			return null ;
		
		StringBuilder sb = new StringBuilder() ;
		MessageDigest digest = null ;
		try {
			digest = MessageDigest.getInstance("MD5");
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			return null ;
		}
		
		//生成一组length=16的byte数组
		byte[] bs = digest.digest(origin.getBytes(Charset.forName(charsetName))) ;
		
		for (int i = 0; i < bs.length; i++) {
			int c = bs[i] & 0xFF ; //byte转int为了不丢失符号位, 所以&0xFF
			if(c < 16){ //如果c小于16,就说明,可以只用1位16进制来表示, 那么在前面补一个0
				sb.append("0");
			}
			sb.append(Integer.toHexString(c)) ;
		}
		return sb.toString() ;
	}
	
	public static void main(String[] args) {
		
		String str = MD5Builder.build("hello,world", "UTF-8") ;
		
		System.out.println(str);
		  
	}

}

结果:  3cb95cfbe1035bce8c448fcaf80fe7d9



接下来是根据一个url长链接生成一个短链接的算法。  这种算法在微博、二维码等应用中使用的比较多。

算法思路:

1、将给定的字符串(长链接) 先转换为32位的一个md5字符串。  比如该字符串用A表示

2、将上面的A字符串分为4段处理, 每段的长度为8 , 比如四段分别为  M、N、O、P

3、可以将M字符串当作一个16进制格式的数字来处理, 将其转换为一个Long类型。  比如转换为L

4、此时L的二进制有效长度为32位, 需要将前面两位去掉,留下30位  , 可以 & 0x3fffffff 得到想要的结果

5、此时L的二进制有效长度为30位, 分为6段处理, 每段的长度为5

6、依次取出L的每一段(5位),进行位操作 &  0x0000003D 得到一个 <= 61的数字,来当做index 。根据index 去预定义的字符表里面去取一个字符, 最后能取出6个字符,此时就能那这6个字符相加,成一个字符串。 作为短链接了。

7、根据2重复3、4、5、6 ,总共能得到6个第六步生成的字符串。 

取其中任意一个字符串当作短链接都是可以的。 

代码如下:

public class ShortURLBuilder {

	public static String[] chars = { "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"
	};

	public static String build(String url){
		if(url == null){
			return null ;
		}
		//先得到url的32个字符的md5码
		String md5 = MD5Builder.build(url, "UTF-8") ;

		//将32个字符的md5码分成4段处理,每段8个字符
		for (int i = 0; i < 4 ; i++) { 

			int offset = i * 8 ;

			String sub = md5.substring(offset, offset + 8) ; 

			long sub16 = Long.parseLong(sub , 16) ; //将sub当作一个16进制的数,转成long  

			// & 0X3FFFFFFF,去掉最前面的2位,只留下30位
			sub16 &= 0X3FFFFFFF ;

			StringBuilder sb = new StringBuilder() ;
			//将剩下的30位分6段处理,每段5位
			for (int j = 0; j < 6 ; j++) {
				//得到一个 <= 61的数字
				long t = sub16 & 0x0000003D ;
				sb.append(chars[(int) t]) ;
				
				sub16 >>= 5 ;  //将sub16右移5位
			}
			
			System.out.println(sb.toString());
		}

		return null ;
	}

	public static void main(String[] args) {
		build("http://blog.csdn.net/is_zhoufeng/article/details/21494281");
	}

}



  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值