在实现爬虫的时候,我们使用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()));
}
}