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

  • 相关阅读:
    HDU5730 Shell Necklace
    BZOJ4883 [Lydsy2017年5月月赛]棋盘上的守卫
    Spring boot 配置文件
    org.joda.time.DateTime 日期操作
    Elasticsearch + Springboot 启动报错 java.net.ConnectException: Connection refused
    centos7 在docker下安装es Elasticsearch
    centos 7 。 docker 安装rabbitmq 以及集权搭建
    linux 安装mysql5.7.25
    安装rabbtimq CentOS 7
    docker + spring boot 打包 部署。
  • 原文地址:https://www.cnblogs.com/hqbhonker/p/4036533.html
Copyright © 2011-2022 走看看