从Java计算文件CheckSum值

时间:2019-03-29 21:34:10

标签: java unix checksum

我正在尝试编写代码以生成与UNIX cksum命令生成的校验和相同的值。

当我在同一文件上运行代码和命令时,得到的值将不同。

我的代码有什么问题?

package cksum;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.zip.Adler32;
import java.util.zip.CRC32;
import java.util.zip.CheckedInputStream;

public class Cksum1 {
    public static void main(String[] args) throws NoSuchAlgorithmException, IOException {
        //MessageDigest md = MessageDigest.getInstance("MD5");
        String File = "C:\\Users\\admin\\Desktop\\logback XMLs\\STG_logback_Debug_All.xml";
        //String File = args[0];
        doChecksum32(File);
    }

    private static void doChecksum32(String fileName) {
        try {
            CheckedInputStream cis = null;
            long fileSize = 0;
            try {
                // Computer CRC32 checksum
                cis = new CheckedInputStream(
                        new FileInputStream(fileName), new CRC32());
                fileSize = new File(fileName).length();
            } catch (FileNotFoundException e) {
                System.err.println("File not found.");
                System.exit(1);
            }
            byte[] buf = new byte[128];
            while (cis.read(buf) >= 0) {
            }
            long checksum = cis.getChecksum().getValue();
            System.out.println(checksum + " " + fileSize + " " + fileName);
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }

}

Java输出:

  

运行:    1478491164 :8335 C:\ Users \ admin \ Desktop \ logback   XMLs \ STG_logback_Debug_All.xml   建立成功(总时间:0秒)

Unix输出:

  

[tibroot @ myserver〜] $ cksum ./STG_logback_Debug_All.xml    1715323814   8335 ./STG_logback_Debug_All.xml

2 个答案:

答案 0 :(得分:2)

cksum的多项式为0x04C11DB7

jdk使用x^32 + x^26 ...

另请参见 https://www.mocky.io/

答案 1 :(得分:0)

对不起,这是部分答案,但是我演示了从cksum -o 3和Java获得匹配的结果。

我不确定cksum的默认算法实现。但是,cksum的“算法3”与ava.util.zip.CRC32完全相同。换句话说,如果我这样做:cksum -o 3 somefile-在Java中,我得到相同的结果:

 static long getCRC32(String filePath) throws IOException {
    CRC32 crc = new CRC32(); 
    ByteBuffer buffer = ByteBuffer.allocate(1024);

    int len = 0;
    try(SeekableByteChannel input = Files.newByteChannel(Paths.get(filePath), StandardOpenOption.READ)) {
      while((len = input.read(buffer)) > 0) {
        buffer.flip();
        crc.update(buffer.array(), 0, len);
      }
    }

    return crc.getValue();   
  }