短链接生成算法与MD5生成32位唯一ID算法
短链接⽣成算法与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 = Instance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
qq自由幻想游戏名字return null ;
}
//⽣成⼀组length=16的byte数组
byte[] bs = digest.Bytes(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.HexString(c)) ;
}
String() ;
}
public static void main(String[] args) {
String str = MD5Builder.build("hello,world", "UTF-8") ;
System.out.println(str);
2017高考时间安排}
}
结果:  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.String());
}
return null ;
}
海绵宝宝歌词public static void main(String[] args) {
build("blog.csdn/is_zhoufeng/article/details/21494281");
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。