如何在 Rust 中异步计算硬盘上文件的校验和?

How do I asynchronously calculate the checksum of a file on the hard disk in Rust?

我在 Rust/Tokio 堆栈中有一个 TCP 文件服务器。

当客户端上传文件时,数据从 tokio::net::TcpStream 读取并写入 futures_fs::FsWriteSink,后者已在单独的 futures_fs::FsPool 上启动。

当文件完全上传后,我需要通过检查其校验和与客户端发送的校验和来检查其一致性。

异步计算校验和的最简单方法是什么,尤其是当文件不适合 RAM 时?

这取决于您要使用的校验和算法,但以 md5 crate 为例,您可以即时计算校验和。应该这样做:

// When starting the file transfer
let mut md5_context = md5::Context::new();

// ...

// as part of your existing processing for each block of data
md5_context.consume (&block);

// ...

// once the last block has been processed
return md5_context.compute();

实际上,在这种情况下,使简单的哈希算法异步是有些多余的,只要一次 MD5 计算花费的时间少于 1 微秒(约 500 纳秒)。

但是,tokio 现在可以使用新的 blocking API。它允许使用内部线程机制执行阻塞或 CPU 繁重的操作。