• 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()));
        }
    }
  • 相关阅读:
    3.5 操作系统习题
    04_jni开发常见错误_本地方法没有找到
    3.4 目录和spooling
    3.3 作业管理
    03_jni_helloworld_完成
    ASP.NET MVC 4 过滤器(Authorize)
    MVC实现实现文件流打包成压缩包
    MVC实现实现文件流打包成压缩包
    MVC实现实现文件流打包成压缩包
    图解分布式架构的演进过程!
  • 原文地址:https://www.cnblogs.com/rayguo/p/3502865.html
Copyright © 2020-2023  润新知