diff --git a/pdf-umbenenner-adapter-out/src/main/java/de/gecheckt/pdf/umbenenner/adapter/out/fingerprint/Sha256FingerprintAdapter.java b/pdf-umbenenner-adapter-out/src/main/java/de/gecheckt/pdf/umbenenner/adapter/out/fingerprint/Sha256FingerprintAdapter.java index 12f38d5..e284ea3 100644 --- a/pdf-umbenenner-adapter-out/src/main/java/de/gecheckt/pdf/umbenenner/adapter/out/fingerprint/Sha256FingerprintAdapter.java +++ b/pdf-umbenenner-adapter-out/src/main/java/de/gecheckt/pdf/umbenenner/adapter/out/fingerprint/Sha256FingerprintAdapter.java @@ -1,6 +1,8 @@ package de.gecheckt.pdf.umbenenner.adapter.out.fingerprint; import java.io.IOException; +import java.io.InputStream; +import java.security.DigestInputStream; import java.nio.file.Files; import java.nio.file.InvalidPathException; import java.nio.file.Path; @@ -45,7 +47,7 @@ public class Sha256FingerprintAdapter implements FingerprintPort { * The implementation: *
- * Reads the entire file content and applies SHA-256 hashing to produce - * a lowercase hexadecimal representation of the digest. + * Liest die Datei blockweise über einen {@link DigestInputStream}, um den Heap-Bedarf + * bei großen PDFs zu minimieren. Das erzeugte Hash-Ergebnis ist bitidentisch zur + * byteweisen Verarbeitung des gesamten Dateiinhalts. * * @param filePath the path to the file to hash; must not be null * @return the lowercase hexadecimal representation of the SHA-256 digest (64 characters) @@ -123,8 +126,16 @@ public class Sha256FingerprintAdapter implements FingerprintPort { */ private String computeSha256Hash(Path filePath) throws IOException, NoSuchAlgorithmException { MessageDigest digest = MessageDigest.getInstance("SHA-256"); - byte[] fileBytes = Files.readAllBytes(filePath); - byte[] hashBytes = digest.digest(fileBytes); + // Streaming-Verarbeitung: Die Datei wird in 8-KB-Blöcken gelesen, damit auch + // sehr große PDFs nicht vollständig in den Heap geladen werden müssen. + byte[] buf = new byte[8192]; + try (InputStream is = Files.newInputStream(filePath); + DigestInputStream dis = new DigestInputStream(is, digest)) { + while (dis.read(buf) != -1) { + // DigestInputStream leitet jeden Block automatisch an den MessageDigest weiter + } + } + byte[] hashBytes = digest.digest(); return bytesToHex(hashBytes); }