【问题标题】:Print md5 checksum values using hashmap and strings使用 hashmap 和字符串打印 md5 校验和值
【发布时间】:2015-12-04 15:08:34
【问题描述】:

我有以下代码用于比较两个文件夹的 md5 哈希值,但我需要显示文件列表和每个文件的哈希值。谁能帮我解决这个问题。我只需要获取一个文件夹的哈希值。

package com.example;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

public class Compare 
{
//This can be any folder locations which you want to compare
File dir1 = new File("/Users/Samip/Desktop/crypto");
File dir2 = new File("/Users/Samip/Desktop/crypto1");
public static void main(String ...args) 
{
    Compare compare = new Compare();
    try
    {
        compare.getDiff(compare.dir1,compare.dir2);
    }
    catch(IOException ie)
    {
        ie.printStackTrace();
    }
}

public void getDiff(File dirA, File dirB) throws IOException
{
    File[] fileList1 = dirA.listFiles();
    File[] fileList2 = dirB.listFiles();
    Arrays.sort(fileList1);
    Arrays.sort(fileList2);
    HashMap<String, File> map1;
    if(fileList1.length < fileList2.length)
    {
        map1 = new HashMap<String, File>();
        for(int i=0;i<fileList1.length;i++)
        {
            map1.put(fileList1[i].getName(),fileList1[i]);
        }

        compareNow(fileList2, map1);
    }
    else
    {
        map1 = new HashMap<String, File>();
        for(int i=0;i<fileList2.length;i++)
        {
            map1.put(fileList2[i].getName(),fileList2[i]);
        }
        compareNow(fileList1, map1);
    }
}

public void compareNow(File[] fileArr, HashMap<String, File> map) throws IOException
{
    for(int i=0;i<fileArr.length;i++)
    {
        String fName = fileArr[i].getName();
        File fComp = map.get(fName);
        map.remove(fName);
        if(fComp!=null)
        {
            if(fComp.isDirectory())
            {
                getDiff(fileArr[i], fComp);
            }
            else
            {
                String cSum1 = checksum(fileArr[i]);
                String cSum2 = checksum(fComp);
                if(!cSum1.equals(cSum2))
                {
                    System.out.println(fileArr[i].getName()+"\t\t"+ "different");
                }
                else
                {
                    System.out.println(fileArr[i].getName()+"\t\t"+"identical");
                }
            }
        }
        else
        {
            if(fileArr[i].isDirectory())
            {
                traverseDirectory(fileArr[i]);
            }
            else
            {
                System.out.println(fileArr[i].getName()+"\t\t"+"only in "+fileArr[i].getParent());
            }
        }
    }
    Set<String> set = map.keySet();
    Iterator<String> it = set.iterator();
    while(it.hasNext())
    {
        String n = it.next();
        File fileFrmMap = map.get(n);
        map.remove(n);
        if(fileFrmMap.isDirectory())
        {
            traverseDirectory(fileFrmMap);
        }
        else
        {
            System.out.println(fileFrmMap.getName() +"\t\t"+"only in "+ fileFrmMap.getParent());
        }
    }
}

public void traverseDirectory(File dir)
{
    File[] list = dir.listFiles();
    for(int k=0;k<list.length;k++)
    {
        if(list[k].isDirectory())
        {
            traverseDirectory(list[k]);
        }
        else
        {
            System.out.println(list[k].getName() +"\t\t"+"only in "+ list[k].getParent());
        }
    }
}

public String checksum(File file) 
{
    try 
    {
        InputStream fin = new FileInputStream(file);
        java.security.MessageDigest md5er = MessageDigest.getInstance("MD5");
        byte[] buffer = new byte[1024];
        int read;
        do 
        {
            read = fin.read(buffer);
            if (read > 0)
                md5er.update(buffer, 0, read);
        } while (read != -1);
        fin.close();
        byte[] digest = md5er.digest();
        if (digest == null)
          return null;
        String strDigest = "0x";
        for (int i = 0; i < digest.length; i++) 
        {
            strDigest += Integer.toString((digest[i] & 0xff) + 0x100,    16).substring(1).toUpperCase();
        }
        return strDigest;
    } 
    catch (Exception e) 
    {
        return null;
    }
}
 }

【问题讨论】:

  • 还是昨天的问题?也许留在一个问题上会比创建一个新问题并每天重新开始更好?
  • 我必须尝试各种方法才能得到结果。我希望我今天能找到答案

标签: java string file hashmap


【解决方案1】:

在你的主要方法中,而不是使用你想要的 Compare.getDiff(dir1, dir2)

  1. 获取目标目录的文件列表
  2. 对每个文件调用 Compare.checksum(file) 并打印结果

看起来你已经有了所有的代码,你只需要稍微改造一下。

【讨论】:

  • 我在过去 12 小时内尝试过,但可能会出现错误......并在五个小时内得到演示。我希望有人可以在这里帮助我。
【解决方案2】:

考虑这个例子。哈希生成代码取自您之前的问题 - 文件迭代代码也是如此。您只需替换该文件夹以匹配您的。

import java.io.*;
import java.security.MessageDigest;

public class PrintChecksums {

    public static void main(String[] args) {
        String sourceDir = "/Users/Jan/Desktop/Folder1";
        try {
            new PrintChecksums().printHashs(new File(sourceDir));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void printHashs(File sourceDir) throws Exception {
        for (File f : sourceDir.listFiles()) {
            String hash = createHash(f); // That you almost have
            System.out.println(f.getAbsolutePath() + " / Hashvalue: " + hash);
        }
    }

    public String createHash(File datafile) throws Exception {
        // SNIP - YOUR CODE BEGINS
        MessageDigest md = MessageDigest.getInstance("SHA1");
        FileInputStream fis = new FileInputStream(datafile);
        byte[] dataBytes = new byte[1024];

        int nread = 0;

        while ((nread = fis.read(dataBytes)) != -1) {
            md.update(dataBytes, 0, nread);
        }

        byte[] mdbytes = md.digest();

        // convert the byte to hex format
        StringBuffer sb = new StringBuffer("");
        for (int i = 0; i < mdbytes.length; i++) {
            sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
        }
        // SNAP - YOUR CODE ENDS
        return sb.toString();
    }

}

【讨论】:

    【解决方案3】:

    请看下面的代码。我添加了一个函数 printCheckSum(),它遍历目录,扫描每个文件并打印其哈希值。

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.security.MessageDigest;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Set;
    
    public class Compare 
    {
    //This can be any folder locations which you want to compare
    File dir1 = new File("D:\\dir1");
    File dir2 = new File("D:\\dir2");
    public static void main(String ...args) 
    {
        Compare compare = new Compare();
        try
        {
            compare.printCheckSum(compare.dir1);
        }
        catch(IOException ie)
        {
            ie.printStackTrace();
        }
    }
    
    public void getDiff(File dirA, File dirB) throws IOException
    {
        File[] fileList1 = dirA.listFiles();
        File[] fileList2 = dirB.listFiles();
        Arrays.sort(fileList1);
        Arrays.sort(fileList2);
        HashMap<String, File> map1;
        if(fileList1.length < fileList2.length)
        {
            map1 = new HashMap<String, File>();
            for(int i=0;i<fileList1.length;i++)
            {
                map1.put(fileList1[i].getName(),fileList1[i]);
            }
    
            compareNow(fileList2, map1);
        }
        else
        {
            map1 = new HashMap<String, File>();
            for(int i=0;i<fileList2.length;i++)
            {
                map1.put(fileList2[i].getName(),fileList2[i]);
            }
            compareNow(fileList1, map1);
        }
    }
    
    public void compareNow(File[] fileArr, HashMap<String, File> map) throws IOException
    {
        for(int i=0;i<fileArr.length;i++)
        {
            String fName = fileArr[i].getName();
            File fComp = map.get(fName);
            map.remove(fName);
            if(fComp!=null)
            {
                if(fComp.isDirectory())
                {
                    getDiff(fileArr[i], fComp);
                }
                else
                {
                    String cSum1 = checksum(fileArr[i]);
                    String cSum2 = checksum(fComp);
                    if(!cSum1.equals(cSum2))
                    {
                        System.out.println(fileArr[i].getName()+"\t\t"+ "different");
                    }
                    else
                    {
                        System.out.println(fileArr[i].getName()+"\t\t"+"identical");
                    }
                }
            }
            else
            {
                if(fileArr[i].isDirectory())
                {
                    traverseDirectory(fileArr[i]);
                }
                else
                {
                    System.out.println(fileArr[i].getName()+"\t\t"+"only in "+fileArr[i].getParent());
                }
            }
        }
        Set<String> set = map.keySet();
        Iterator<String> it = set.iterator();
        while(it.hasNext())
        {
            String n = it.next();
            File fileFrmMap = map.get(n);
            map.remove(n);
            if(fileFrmMap.isDirectory())
            {
                traverseDirectory(fileFrmMap);
            }
            else
            {
                System.out.println(fileFrmMap.getName() +"\t\t"+"only in "+ fileFrmMap.getParent());
            }
        }
    }
    
    public void traverseDirectory(File dir)
    {
        File[] list = dir.listFiles();
        for(int k=0;k<list.length;k++)
        {
            if(list[k].isDirectory())
            {
                traverseDirectory(list[k]);
            }
            else
            {
                System.out.println(list[k].getName() +"\t\t"+"only in "+ list[k].getParent());
            }
        }
    }
    
    public String checksum(File file) 
    {
        try 
        {
            InputStream fin = new FileInputStream(file);
            java.security.MessageDigest md5er = MessageDigest.getInstance("MD5");
            byte[] buffer = new byte[1024];
            int read;
            do 
            {
                read = fin.read(buffer);
                if (read > 0)
                    md5er.update(buffer, 0, read);
            } while (read != -1);
            fin.close();
            byte[] digest = md5er.digest();
            if (digest == null)
              return null;
            String strDigest = "0x";
            for (int i = 0; i < digest.length; i++) 
            {
                strDigest += Integer.toString((digest[i] & 0xff) + 0x100,    16).substring(1).toUpperCase();
            }
            return strDigest;
        } 
        catch (Exception e) 
        {
            return null;
        }
    }
    
    public void printCheckSum(File dir) throws IOException{
    
         File[] fileList = dir.listFiles();
    
         for(File file : fileList){
    
             if(file.isDirectory()){
                 printCheckSum(file);
    
             }else
                  System.out.println(file.getName() +"\t :: \t" + checksum(file));
         }
    
    }
     }
    

    希望这会有所帮助。干杯!

    【讨论】:

      猜你喜欢
      • 2011-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      • 1970-01-01
      • 2010-12-26
      • 1970-01-01
      相关资源
      最近更新 更多