如何在 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 繁重的操作。
我在 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 繁重的操作。