md5碼如何轉換成鏈接?
首先將一個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
接下來是根據一個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個第六步生成的字符串。
取其中任意一個字符串當作短鏈接都是可以的。