首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于Clojure中大文件的md5散列

用于Clojure中大文件的md5散列
EN

Stack Overflow用户
提问于 2021-03-07 22:04:46
回答 2查看 249关注 0票数 1

如何修改此代码以处理更大的文件(2 GB)?在Java中-在Clojure中使用小缓冲区和update() -如何?

代码语言:javascript
复制
(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

感谢您的回答。

EN

回答 2

Stack Overflow用户

发布于 2021-03-08 11:43:13

您可以使用DigestInputStream来计算散列,而无需同时将所有字节保存到内存中,因为它会随着您消耗源流中的字节而递增地计算散列。

代码语言:javascript
复制
(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)实例。

票数 4
EN

Stack Overflow用户

发布于 2021-03-07 22:25:21

clj-digest使用较小的缓冲区来计算MD5和其他消息摘要。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66517365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档