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
。谢谢你帮我克服了心理障碍!