我在 Rust / Tokio 堆栈中有一个 TCP 文件服务器。
当客户端上传文件时,数据正在从 a 读取tokio::net::TcpStream
并写入 a futures_fs::FsWriteSink
,它已在单独的futures_fs::FsPool
.
文件完全上传后,我需要通过检查其校验和与客户端发送的校验和来检查其一致性。
异步计算校验和的最简单方法是什么,尤其是在文件不适合 RAM 的情况下?
我在 Rust / Tokio 堆栈中有一个 TCP 文件服务器。
当客户端上传文件时,数据正在从 a 读取tokio::net::TcpStream
并写入 a futures_fs::FsWriteSink
,它已在单独的futures_fs::FsPool
.
文件完全上传后,我需要通过检查其校验和与客户端发送的校验和来检查其一致性。
异步计算校验和的最简单方法是什么,尤其是在文件不适合 RAM 的情况下?
这取决于您要使用的校验和算法,但以md5 箱为例,您可以即时计算校验和。这样的事情应该这样做:
// 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 us(大约 500 ns)。
但是,一个新的blocking
API 现在可以在tokio
. 它允许使用内部线程机制执行阻塞或 CPU 繁重的操作。