diff --git a/.jules/bolt.md b/.jules/bolt.md new file mode 100644 index 0000000..edca778 --- /dev/null +++ b/.jules/bolt.md @@ -0,0 +1,3 @@ +## 2024-05-15 - [Java Hex Conversion Optimization] +**Learning:** Using `String.format("%02x", b)` in a loop to convert byte arrays to hex strings is a significant performance anti-pattern. It creates excessive string allocations and slows down operations. This is a common performance bottleneck specific to this codebase's architecture when generating hashes like SHA-256 for documents. +**Action:** Replace `String.format` loops with Java 17+ `java.util.HexFormat.of().formatHex(bytes)`. This provides a more direct, allocation-efficient conversion. Keep this pattern in mind for any future byte manipulation or hashing implementations. \ No newline at end of file diff --git a/src/main/java/com/clearfolio/viewer/service/DefaultDocumentConversionService.java b/src/main/java/com/clearfolio/viewer/service/DefaultDocumentConversionService.java index 9c59593..92e76a5 100644 --- a/src/main/java/com/clearfolio/viewer/service/DefaultDocumentConversionService.java +++ b/src/main/java/com/clearfolio/viewer/service/DefaultDocumentConversionService.java @@ -7,6 +7,7 @@ import java.io.InputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.util.HexFormat; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -121,12 +122,7 @@ private String contentHash(MultipartFile file) { } byte[] raw = digest.digest(); - StringBuilder hex = new StringBuilder(raw.length * 2); - for (byte b : raw) { - hex.append(String.format("%02x", b)); - } - - return hex.toString(); + return HexFormat.of().formatHex(raw); } catch (NoSuchAlgorithmException ex) { throw new IllegalStateException("SHA-256 digest unavailable", ex); } catch (IOException ex) {