SHA256的数据流

时间:2017-07-24 13:48:13

标签: scala akka-stream akka-http

我有一个用例,我正在使用GET请求从URL下载文件。是否可以在不保存到磁盘或将整个对象保存在内存中的情况下计算文件流的SHA256?

3 个答案:

答案 0 :(得分:3)

这可以通过MessageDigestSink.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();