Scala Akka流的链签名元素

Scala Akka流的链签名元素,scala,akka-stream,Scala,Akka Stream,我有一个源代码[ByteString],需要按照以下方式进行转换: 每个ByteString元素都需要连接一个加密签名 要连接到流中第一个元素的签名是预先知道的 之后的每个签名都是从前面元素(无符号版本)中的数据计算出来的,然后连接到相应的元素 理想的结果在概念上是通过签名链接在一起的数据块的源。整个功能签名将是(Source[ByteString])=>Source[ByteString]。几乎像一个map(),但在计算上将后面的元素与前面的元素绑定在一起 我曾希望使用Source.fol

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

  • 每个
    ByteString
    元素都需要连接一个加密签名
  • 要连接到流中第一个元素的签名是预先知道的
  • 之后的每个签名都是从前面元素(无符号版本)中的数据计算出来的,然后连接到相应的元素
理想的结果在概念上是通过签名链接在一起的数据块的
。整个功能签名将是
(Source[ByteString])=>Source[ByteString]
。几乎像一个
map()
,但在计算上将后面的元素与前面的元素绑定在一起

我曾希望使用
Source.fold()
来实现这一点,但我找不到合适的
zero
,它可以让我将签名带到fold的每个迭代中,但也会像映射流一样发出签名块

(具体地说,我正在尝试实现AWS S3算法,用于对分块对象上载进行签名,如中所述。)


这里采取什么样的好方法?

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

因此,假设您有一个方法
def sign(preveElement:ByteString,thiseElement:ByteString):ByteString
,您的流程可以描述如下:

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

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

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

因此,假设您有一个方法
def sign(preveElement:ByteString,thiseElement:ByteString):ByteString
,您的流程可以描述如下:

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

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

scan
确实正是我需要的。我将零设置为元组
(zeroSignature,ByteString.empty)
,在
扫描之后,
刚刚执行了
.map(u._2).filterNot(u.isEmpty)
删除第零个
ByteString
。谢谢你帮我克服了心理障碍<代码>扫描
确实正是我所需要的。我将零设置为元组
(zeroSignature,ByteString.empty)
,在
扫描之后,
刚刚执行了
.map(u._2).filterNot(u.isEmpty)
删除第零个
ByteString
。谢谢你帮我克服了心理障碍!