zoukankan      html  css  js  c++  java
  • JAVA-读取文件部分内容计算HASH值

    对于一些大文件,有时会需要计算部分内容的Hash,下面的函数计算了 文件头尾各1M,中间跳跃100M取10K 以及文件大小的Hash值

    public static String CalHash(String path) throws IOException 
        {
            File file = new File(path);
            if (!file.canRead())
                return "";
            if (file.length() < 150 * 1024 * 1024) {
                return "";
            }
            
            //FileInputStream in = new FileInputStream(file);
            RandomAccessFile in = new RandomAccessFile(file, "r");
            
            MessageDigest messagedigest;
            try {
                messagedigest = MessageDigest.getInstance("SHA1");
                int szRead = 0;
                int size_1M = 1024*1024; 
                byte[] buffer = new byte[size_1M];
                // 文件头尾各1M,中间跳跃100M取10K算Hash
                // 开头
                szRead = in.read(buffer);
                messagedigest.update(buffer);
                // 结尾
                in.seek(file.length() - size_1M);
                szRead = in.read(buffer);
                messagedigest.update(buffer);
    
                int BUFFER_SIZE = (10 * 1024);
                buffer = new byte[(int) BUFFER_SIZE];
    
                long endPos = file.length() - 1024 * 1024 - BUFFER_SIZE;
                long skipSize = (long) ( ((float) (file.length() / (float) (100.0 * 1024.0 * 1024.0) - (float) 1.0) * BUFFER_SIZE) );
                long currentPos = 1024 * 1024;
                in.seek(currentPos);
                while (in.getFilePointer() < endPos && in.read(buffer) > 0) {
                    in.seek(in.getFilePointer() + skipSize);                
                    messagedigest.update(buffer);
                }
    
                // 计算文件size的hash
                long fsize = file.length();
                byte[] fSizeBytes = getBytes(fsize);
                messagedigest.update(fSizeBytes);
                return byte2hex(messagedigest.digest());
                
            } catch (NoSuchAlgorithmException e) {
            } catch (OutOfMemoryError e) {
            } finally {
                in.close();
            }
            return null;
        }
  • 相关阅读:
    安装开发工具
    CSS基础
    CSS动画
    CSS效果
    CSS布局
    CSS预处理语言
    React开发笔记
    Vue2.0学习笔记
    Vue-cli3.0开发笔记
    项目开发技巧
  • 原文地址:https://www.cnblogs.com/inbase/p/4239611.html
Copyright © 2011-2022 走看看