问题描述
我正在使用类似这样的文件来计算文件的校验和:
pub fn sha256_digest(file_path: &str) -> Result<String,Box<dyn Error>> {
let file = fs::File::open(file_path)?;
let mut reader = BufReader::new(file);
let mut context = Context::new(&SHA256);
loop {
let consummed = {
let buffer = reader.fill_buf()?;
if buffer.is_empty() {
break;
}
context.update(buffer);
buffer.len()
};
reader.consume(consummed);
}
let digest = context.finish();
Ok(write_hex_bytes(digest.as_ref()))
}
校验和:
dca3b9746da896f05072bdec6b788513029b26ab453b82e2e9d4365e56e2c913
Elapsed: 226.14ms
我已经用tokio尝试过此操作
async fn sha256_digest(file_path: &str) -> Result<String,Box<dyn Error>> {
let file = File::open(file_path).await?;
let mut stream = FramedRead::new(file,BytesCodec::new());
let mut context = Context::new(&SHA256);
while let Some(bytes) = stream.try_next().await? {
context.update(&bytes);
}
let digest = context.finish();
Ok(write_hex_bytes(digest.as_ref()))
}
但是不幸的是,计算校验和需要两倍的时间,因此我想尝试使用tokio::io::BufReader
的选项,我遇到的问题是实现Trait AsyncBufRead,以便我可以使用consume方法。
校验和:
dca3b9746da896f05072bdec6b788513029b26ab453b82e2e9d4365e56e2c913
Elapsed: 448.25ms
我正在尝试:
async fn sha256_digest_BufReader(file_path: &str) -> Result<String,Box<dyn Error>> {
let file = File::open(file_path).await?;
let mut reader = BufReader::new(file);
let mut context = Context::new(&SHA256);
loop {
let consummed = {
let buffer = reader.buffer();
if buffer.is_empty() {
break;
}
context.update(buffer);
buffer.len()
};
reader.consume(consummed);
}
let digest = context.finish();
Ok(write_hex_bytes(digest.as_ref()))
}
但是出现此错误:
error[E0599]: no method named `consume` found for struct `tokio::io::util::buf_reader::BufReader<tokio::fs::file::File>` in the current scope
--> src/main.rs:63:16
|
63 | reader.consume(consummed);
| ^^^^^^^ method not found in `tokio::io::util::buf_reader::BufReader<tokio::fs::file::File>`
warning: unused import: `tokio::io::AsyncBufRead`
关于如何实施的任何想法?
更新:我正在尝试:
async fn sha256_digest_BufReader(file_path: &str) -> Result<String,Box<dyn Error>> {
let file = File::open(file_path).await?;
let mut reader = BufReader::new(file);
let mut context = Context::new(&SHA256);
let mut buf: [u8; 8192] = [0; 8192]; //chunk size (8K,65536,etc)
while let Ok(size) = reader.read(&mut buf[..]).await {
if size == 0 {
break;
}
context.update(&buf[0..size]);
}
let digest = context.finish();
Ok(write_hex_bytes(digest.as_ref()))
}
但是仍然运行“缓慢”或至少两倍的时间,甚至更改块大小,例如使用65536
,131072
进行测试。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)