阿卡流的链签名元素

时间:2017-11-28 08:03:27

标签: scala akka-stream

我有一个Source[ByteString],需要按以下方式进行转换:

  • 每个ByteString元素都需要连接一个加密签名。
  • 预先知道要连接到流中第一个元素的签名。
  • 之后的每个签名都是根据前一个元素(无符号版本)中的数据计算出来的,然后连接到相应的元素。

理想情况下,期望的结果是通过签名链接在一起的Source个数据块。整体功能签名为(Source[ByteString]) => Source[ByteString]。几乎像map(),但计算上将后来的元素绑定到它们的前辈。

我曾希望使用Source.fold()来实现这一目标,但我无法找到合适的zero,它会让我在每次迭代中都带有签名,但也会发出签名块就像流刚刚被映射过一样。

(具体而言,我正在尝试实施AWS S3算法来签署分块对象上传,如http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html#sigv4-chunked-body-definition所述。)

这是一个很好的方法吗?

1 个答案:

答案 0 :(得分:2)

你几乎想到在这里使用fold - 你需要scan,它基本上是相同的,但保留了转换元素的流,并将结果传递给下一次迭代。

因此,如果你有方法def sign(prevElement: ByteString, thisElement: ByteString): ByteString,你的流程可以描述如下:

Flow[String]
  .scan(zeroSignature)(sign)
  .drop(1)

scan保留您可能不需要的零元素,因此需要drop(1)才能丢弃它。