Вычислить значение контрольной суммы файла из Java
Я пытаюсь написать код для генерации того же значения контрольной суммы, которое генерируется командой 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


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

30.03.2019 01:05:10
полином для cksum
равен 0x04C11DB7
в то время как jdk использует x^32 + x^26 ...
смотреть также https://en.wikipedia.org/wiki/Cyclic_redundancy_check








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();
}