我有一个用例,其中我正在使用GET请求从URL下载文件。是否可以在不保存到磁盘或不将整个对象保存在内存中的情况下计算文件流的SHA256?
这是可以实现与MessageDigest
和Sink.fold
。
首先,我们需要一个函数来创建一个空摘要,并需要一个函数来更新摘要ByteBuffer
:
import java.security.MessageDigest
import java.nio.ByteBuffer
def emptySHA256Digest : MessageDigest = MessageDigest getInstance "SHA-256"
val updateDigest : (MessageDigest, ByteBuffer) => MessageDigest =
(messageDigest, byteBuffer) => {
messageDigest update byteBuffer
messageDigest
}
这两个函数然后可以被施加到折叠中使用entity
的HttpResponse
更新与所有的消化ByteString
在实体值:
import akka.http.scaladsl.model.HttpResponse
val responseBodyToDigest : HttpResponse => Future[MessageDigest] =
(_ : HttpResponse)
.entity
.dataBytes
.map(_.asByteBuffer)
.runFold(emptySHA256Digest)(updateDigest)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句