MD5算法-爬蟲學習(五)


  在實現爬蟲的時候,我們使用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()));
    }
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM