diff --git a/.jules/bolt.md b/.jules/bolt.md new file mode 100644 index 0000000..fdc927f --- /dev/null +++ b/.jules/bolt.md @@ -0,0 +1,3 @@ +## 2024-06-27 - HexFormat Optimization +**Learning:** Using `String.format("%02x", b)` in a loop for byte to hex conversion creates significant overhead due to excessive object allocations and parsing. +**Action:** Always prefer `java.util.HexFormat.of().formatHex(raw)` introduced in Java 17 for byte array to hex string conversions, as it is highly optimized and avoids unnecessary object creation. diff --git a/src/main/java/com/clearfolio/viewer/service/DefaultDocumentConversionService.java b/src/main/java/com/clearfolio/viewer/service/DefaultDocumentConversionService.java index 9c59593..9dd4b0d 100644 --- a/src/main/java/com/clearfolio/viewer/service/DefaultDocumentConversionService.java +++ b/src/main/java/com/clearfolio/viewer/service/DefaultDocumentConversionService.java @@ -121,12 +121,10 @@ 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(); + // ⚡ Bolt Optimization: Use java.util.HexFormat instead of + // String.format in loop to eliminate excessive object allocation + // overhead and significantly speed up hex string conversion. + return java.util.HexFormat.of().formatHex(raw); } catch (NoSuchAlgorithmException ex) { throw new IllegalStateException("SHA-256 digest unavailable", ex); } catch (IOException ex) {