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()));
    }
}
原文地址:https://www.cnblogs.com/rayguo/p/3502865.html