我想知道如何使用scalaz-stream和java.security.MessageDigest生成文件的摘要?
我希望使用固定的内存缓冲区大小(例如4KB)。我认为我知道如何开始读取文件,但我不知道如何:
1) 对每个4KB调用digest.update(buf)
,这实际上是对Java MessageDigest实例进行的副作用,我猜应该在scalaz-stream框架中发生。
2) 最后调用digest.digest()
来从scalaz-stream框架中以某种方式接收计算出的摘要?
我大概知道如何开始:
import scalaz.stream._
import java.security.MessageDigest
val f = "/a/b/myfile.bin"
val bufSize = 4096
val digest = MessageDigest.getInstance("SHA-256")
Process.constant(bufSize).toSource
.through(io.fileChunkR(f, bufSize))
但是我现在卡住了!有什么提示吗?我猜肯定也可以将摘要对象的创建、更新、检索(实际摘要计算)和销毁包装在 scalaz-stream Sink 中,然后调用 .to()
并传递该 Sink?如果我使用了错误的术语,请原谅,我完全是新手。我已经尝试了一些示例,但仍然感到困难。
.pipe
而不是创建一个Sink。我猜这是因为Sink不能发出结果,而Process可以? - adamretterSink[F[_],O]
是Process[F, O => F[Unit]]
的类型别名,因此它们是返回Unit
的有副作用函数的来源。正如您所演示的,您可以将输入的ByteVector
发送到Sink
,但没有办法从中获取最终摘要。hash
中的进程是Process1
:它们可以消耗和发出值。文件的块被导入到sha1
中以更新摘要,并且当没有更多输入值时,它只会发出最终摘要。 - Frank S. Thomas