我有一个用例,我正在使用GET请求从URL下载文件。是否可以在不保存到磁盘或将整个对象保存在内存中的情况下计算文件流的SHA256?
答案 0 :(得分:3)
这可以通过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
的{{1}},以使用实体中的所有HttpResponse
值更新摘要:
ByteString
答案 1 :(得分:2)
您需要Flow
,它会将一个数据转换为另一个数据。在您的情况下,您希望将纯文本转换为sha256文本。
def digest(algorithm: String = "SHA-256"): Flow[ByteString, ByteString, NotUsed] = {
Flow[ByteString].fold(MessageDigest.getInstance(algorithm)){
case (digest: MessageDigest, bytes:ByteString) => {digest.update(bytes.asByteBuffer); digest}}
.map {case md: MessageDigest => ByteString(md.digest())}
}
答案 2 :(得分:1)
使用MessageDigest.getInstance("SHA-256").update
方法之一。
将文件逐个传递给它。
然后拨打digest()
示例代码:
MessageDigest instance = MessageDigest.getInstance("SHA-256");
for(byte[] arr: source){
instance.update(arr);
}
byte[] result = instance.digest();