如何修改此代码以处理更大的文件(2 GB)?在Java中-在Clojure中使用小缓冲区和update() -如何?
(defn md5 [io-factory]
(let [bytes'
(with-open [xin (clojure.java.io/input-stream io-factory)
xout (java.io.ByteArrayOutputStream.)]
(clojure.java.io/copy xin xout)
(.toByteArray xout))
algorithm (java.security.MessageDigest/getInstance "MD5")
raw (.digest algorithm bytes')]
(format "%032x" (BigInteger. 1 raw))))
; Execution error (OutOfMemoryError) at java.util.Arrays/copyOf (Arrays.java:3236).
; Java heap space感谢您的回答。
发布于 2021-03-08 11:43:13
您可以使用DigestInputStream来计算散列,而无需同时将所有字节保存到内存中,因为它会随着您消耗源流中的字节而递增地计算散列。
(defn copy+md5 [source sink]
(let [digest (MessageDigest/getInstance "MD5")]
(with-open [input-stream (io/input-stream source)
digest-stream (DigestInputStream. input-stream digest)
output-stream (io/output-stream sink)]
(io/copy digest-stream output-stream))
(format "%032x" (BigInteger. 1 (.digest digest)))))如果除了计算散列之外,您没有对源的内容执行任何操作,那么可以为接收器执行use the /dev/null equivalent (OutputStream/nullOutputStream)实例。
发布于 2021-03-07 22:25:21
clj-digest使用较小的缓冲区来计算MD5和其他消息摘要。
https://stackoverflow.com/questions/66517365
复制相似问题