zoukankan      html  css  js  c++  java
  • Java 获取 文件md5校验码

    讯雷下载的核心思想是校验文件的md5值,两个文件若md5相同则为同一文件。

    当得到用户下载某个文件的请求后它根据数据库中保留的文件md5比对出拥有此文件的url,

    将用户请求挂接到此url上并仿造一个虚假的断点续传请求,从若干url上将一个正常文件拼接出来。

    查了下资料,java也可以实现文件md5校验码获取,代码如下:

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.nio.MappedByteBuffer;
    import java.nio.channels.FileChannel;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;

    public class MD5Util {

    protected static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9','a', 'b', 'c', 'd', 'e', 'f' };
    protected static MessageDigest messagedigest = null;
    static{
       try{
        messagedigest = MessageDigest.getInstance("MD5");
       }catch(NoSuchAlgorithmException nsaex){
        System.err.println(MD5Util.class.getName()+"初始化失败,MessageDigest不支持MD5Util。");
        nsaex.printStackTrace();
       }
    }


    public static String getFileMD5String(File file) throws IOException {
       FileInputStream in = new FileInputStream(file);
       FileChannel ch = in.getChannel();
       MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
       messagedigest.update(byteBuffer);
       return bufferToHex(messagedigest.digest());
    }

    public static String getMD5String(String s) {
       return getMD5String(s.getBytes());
    }

    public static String getMD5String(byte[] bytes) {
       messagedigest.update(bytes);
       return bufferToHex(messagedigest.digest());
    }

    private static String bufferToHex(byte bytes[]) {
       return bufferToHex(bytes, 0, bytes.length);
    }

    private static String bufferToHex(byte bytes[], int m, int n) {
       StringBuffer stringbuffer = new StringBuffer(2 * n);
       int k = m + n;
       for (int l = m; l < k; l++) {
        appendHexPair(bytes[l], stringbuffer);
       }
       return stringbuffer.toString();
    }


    private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
       char c0 = hexDigits[(bt & 0xf0) >> 4];
       char c1 = hexDigits[bt & 0xf];
       stringbuffer.append(c0);
       stringbuffer.append(c1);
    }

    public static boolean checkPassword(String password, String md5PwdStr) {
       String s = getMD5String(password);
       return s.equals(md5PwdStr);
    }

    public static void main(String[] args) throws IOException {
       long begin = System.currentTimeMillis();

       //2EA3E66AC37DF7610F5BD322EC4FFE48 670M 11s kuri双核1.66G 2G内存
       File big = new File("e:/新建文件夹.rar");

       String md5=getFileMD5String(big);

       long end = System.currentTimeMillis();
       System.out.println("md5:"+md5+" time:"+((end-begin)/1000)+"s");
    }

    }

    转载自:http://blog.sina.com.cn/s/blog_53d3c24a0100mpm1.html

  • 相关阅读:
    HTB-靶机-Charon
    第一篇Active Directory疑难解答概述(1)
    Outlook Web App 客户端超时设置
    【Troubleshooting Case】Exchange Server 组件状态应用排错?
    【Troubleshooting Case】Unable to delete Exchange database?
    Exchange Server 2007的即将生命周期,您的计划是?
    "the hypervisor is not running" 故障
    Exchange 2016 体系结构
    USB PE
    10 months then free? 10个月,然后自由
  • 原文地址:https://www.cnblogs.com/hqbhonker/p/4036533.html
Copyright © 2011-2022 走看看