Вычислить значение контрольной суммы файла из Java

Вычислить значение контрольной суммы файла из Java

30.03.2019 12:34:09 Просмотров 25 Источник

Я пытаюсь написать код для генерации того же значения контрольной суммы, которое генерируется командой 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 Рабочей Директории\STG_logback_Debug_All.XML Сборка прошла успешно (общее время: 0 секунд)

Выходные данные Unix:

[tibroot@myserver ~] $ cksum ./STG_logback_Debug_All.XML 1715323814 8335 ./STG_logback_Debug_All.XML

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/55425731/calculate-file-checksum-value-from-java#comment97571198_55425731
@farmer1992 объяснил это здесь, почему это так, но у вас есть ссылка со всеми chksums в palacsint answer.

Ответы - Вычислить значение контрольной суммы файла из Java / Calculate File CheckSum value from Java

farmer1992

30.03.2019 01:05:10

полином для cksumравен 0x04C11DB7

в то время как jdk использует x^32 + x^26 ...

смотреть также https://en.wikipedia.org/wiki/Cyclic_redundancy_check

https://stackoverflow.com/questions/55425731/calculate-file-checksum-value-from-java/55426028#comment97627095_55426028
Итак, Java-код никогда не даст того же значения, что и Unix?
https://stackoverflow.com/questions/55425731/calculate-file-checksum-value-from-java/55426028#comment97678923_55426028
Вы можете выбрать другую библиотеку crc32, aglo которой совпадает с cksum
https://stackoverflow.com/questions/55425731/calculate-file-checksum-value-from-java/55426028#comment97732160_55426028
Я погуглил может быть вы захотите попробовать это github.com/snksoft/java-crc/blob/master/src/main/java/com/…
https://stackoverflow.com/questions/55425731/calculate-file-checksum-value-from-java/55426028#comment97856513_55426028
Я попробовал это, а также проверить различные реализации CRC Java. Ни один из них не возвращал то же значение, что и сервер Unix.
https://stackoverflow.com/questions/55425731/calculate-file-checksum-value-from-java/55426028#comment97856534_55426028
Просто интересно, я запускаю свой Java-код на своем ПК (Win 10) и запускаю команду на Oracle Free Linux OS - имеет ли это значение?
https://stackoverflow.com/questions/55425731/calculate-file-checksum-value-from-java/55426028#comment97899736_55426028
Ни один JVM не даст одинакового результата на каждой платформе
https://stackoverflow.com/questions/55425731/calculate-file-checksum-value-from-java/55426028#comment104496322_55426028
Вы проверяете XML-файл. Убедитесь, что вы двоично копируете его между Windows и Linux. Некоторые инструменты копирования не стесняются изменять байты конца строки внутри файла; это нарушит любую контрольную сумму.
Chris Wolf

24.01.2020 04:58:28

Извините, это неполный ответ, но я демонстрирую получение совпадающих результатов от cksum -o 3и Java.

Я не уверен в реализации алгоритма по умолчанию cksum. Однако "алгоритм 3" cksumточно такой же, как 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();   
  }
Закрыть X