在實現爬蟲的時候,我們使用Hash結構去存儲我們用過的URL的時候,有些URL可能長度很長,為了更加節省空間,我們就要對URL進行壓縮,幫它減減肥,這個我們介紹這個MD5算法,可以對URL進行有效的壓縮。
下面我們會講講MD5算法的一些細節,不過我們大可不必在意,我們只需要知道,我們對一個很長很長的字符串進行MD5壓縮,返回的是一個128位整數,這個字符串就是原字符串的唯一標示符,就好像是我們的身份證一樣,通過這個id就可以標識唯一的你。
MD5算法描述:MD5以512位分組來處理輸入的信息,且每一分組又被划分為16個32位子分組,經過一系列的處理后,算法的輸出有4個32位分組組成,將這4個32位分組級聯后將生成一個128位的散列值。在MD5算法中,首先需要對信息進行填充,使其位長度對512求余的結果等於448,因此,信息的位長度將被擴展為N*512+448,在信息的后面附加一個1和無數個0,知道滿足上面的條件才停止用0對信息進行填充,然后在這個結果的后面附加一個64位二進制表示的填充前的信息長度,通過這幾步的處理,現在的信息字節長度=N*512+448+64=(N+1)*512,即長度恰好是512的整數倍。
在Java中,java.security.MessageDigest中定義了MD5的計算,只需要簡單地調用即可得到MD5的128位整數,然后將此128位轉換成十六進制表示即可。通過這樣的轉換就可以將很長的字符串變成長度為32的字符串。
先來看看MessageDigest這個類:
介紹:此 MessageDigest 類為應用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的單向哈希函數,它接收任意大小的數據,並輸出固定長度的哈希值。
getInstance(String algorithm):這個該類的靜態方法,返回具有指定算法名稱的信息摘要。
update(byte[] input):使用指定的byte數組去更新摘要,這個byte數組其實就是我們要壓縮的那個字符串的數組。
digest():通過執行諸如填充之類的最終操作完成哈希計算,其實就是根據MD5算法計算出一個128位的長整數,也即使16個字節。
下面具體來看看:
public class MD5Util { public static String getMD5(byte[] input) { //用來將字節轉換成十六進制表示的字符 char[] str = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; try{ MessageDigest md = MessageDigest.getInstance("MD5"); md.update(input); //這里結果是128位的長整數,用字節表示就是16個字節 byte[] temp = md.digest(); //每個字節用十六進制表示的話,需要用2個字符 char[] ch = new char[16*2]; //表示轉換結果中對應的字符位置 int index = 0; for(int i = 0; i < 16; i++) { byte b = temp[i]; ch[index++] = str[b >>> 4 & 0xf]; ch[index++] = str[b & 0xf]; } return new String(ch); }catch(Exception e) { e.printStackTrace(); } return null; } public static void main(String[] args) { System.out.println(MD5Util.getMD5("www.hao123.com".getBytes())); } }