http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 6109|回复: 4

[算法] MD5算法代码实现

[复制链接]
发表于 2014-1-3 08:46:38 | 显示全部楼层 |阅读模式
在实现爬虫的时候,我们使用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的整数倍。
                       02232009-f1f1e1df7f1343589aa1e89081ae541a.jpg
  在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个字节。
下面具体来看看:
[C#] 纯文本查看 复制代码
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()));
    }
}



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2014-1-3 17:43:34 | 显示全部楼层
那请问怎么解析?
发表于 2014-1-5 10:55:48 | 显示全部楼层
killse 发表于 2014-1-3 17:43
那请问怎么解析?

MD5算法是不可逆的
发表于 2014-1-6 09:57:07 | 显示全部楼层
佐υ佑 发表于 2014-1-5 10:55
MD5算法是不可逆的

呃。看花了,但是不可解析的URL也没用吧
发表于 2014-7-8 12:46:32 | 显示全部楼层
现在没时间看,先留个记号,回头细细品味!
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-19 11:27

© 2014-2021

快速回复 返回顶部 返回列表