Rust 如何使用tokio::io::BufReader进行分块阅读

Rust 如何使用tokio::io::BufReader进行分块阅读,rust,rust-tokio,Rust,Rust Tokio,我使用以下方法计算文件的校验和: pub fn sha256\u摘要(文件路径:&str)->结果{ 让file=fs::file::open(文件路径)?; 让mut reader=BufReader::new(文件); 让mut context=context::new(&SHA256); 环路{ 让consummed={ 让buffer=reader.fill_buf()?; 如果buffer.is_为空(){ 打破 } 上下文更新(缓冲区); buffer.len() }; 读者消费(消

我使用以下方法计算文件的校验和:

pub fn sha256\u摘要(文件路径:&str)->结果{
让file=fs::file::open(文件路径)?;
让mut reader=BufReader::new(文件);
让mut context=context::new(&SHA256);
环路{
让consummed={
让buffer=reader.fill_buf()?;
如果buffer.is_为空(){
打破
}
上下文更新(缓冲区);
buffer.len()
};
读者消费(消费);
}
让digest=context.finish();
Ok(写入十六进制字节(摘要.as\u ref())
}
校验和:

dca3b9746da896f05072bdec6b788513029b26ab453b82e2e9d4365e56e2c913
Elapsed: 226.14ms
dca3b9746da896f05072bdec6b788513029b26ab453b82e2e9d4365e56e2c913
Elapsed: 448.25ms
我已经在东京试过了:

async fn sha256\u摘要(文件路径:&str)->结果{
让文件=文件::打开(文件路径)。等待?;
让mut stream=FramedRead::new(文件,BytesCodec::new());
让mut context=context::new(&SHA256);
而让一些(字节)=流。尝试_next()。等待{
context.update(&bytes);
}
让digest=context.finish();
Ok(写入十六进制字节(摘要.as\u ref())
}

但不幸的是,计算校验和需要两倍的时间,因此我想尝试使用
tokio::io::BufReader
的一个选项。我面临的问题是实现,以便使用该方法

校验和:

dca3b9746da896f05072bdec6b788513029b26ab453b82e2e9d4365e56e2c913
Elapsed: 226.14ms
dca3b9746da896f05072bdec6b788513029b26ab453b82e2e9d4365e56e2c913
Elapsed: 448.25ms
我正在努力:

async fn sha256\u digest\u BufReader(文件路径:&str)->结果{
让文件=文件::打开(文件路径)。等待?;
让mut reader=BufReader::new(文件);
让mut context=context::new(&SHA256);
环路{
让consummed={
让buffer=reader.buffer();
如果buffer.is_为空(){
打破
}
上下文更新(缓冲区);
buffer.len()
};
读者消费(消费);
}
让digest=context.finish();
Ok(写入十六进制字节(摘要.as\u 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`
error[E0599]:在当前作用域中找不到结构`tokio::io::util::buf_reader::BufReader`的名为`consume`的方法
-->src/main.rs:63:16
|
63 |读者消费(消费);
|在'tokio::io::util::buf_reader::BufReader::BufReader'中找不到方法`
警告:未使用的导入:`tokio::io::AsyncBufRead`
你知道如何实施吗

更新:我正在尝试:

async fn sha256\u digest\u BufReader(文件路径:&str)->结果{
让文件=文件::打开(文件路径)。等待?;
让mut reader=BufReader::new(文件);
让mut context=context::new(&SHA256);
让mut buf:[u8;8192]=[0;8192];//块大小(8K、65536等)
而让Ok(大小)=reader.read(&mut buf[…])等待{
如果大小==0{
打破
}
context.update(&buf[0..size]);
}
让digest=context.finish();
Ok(写入十六进制字节(摘要.as\u ref())
}

但是仍然运行“慢”或至少两倍的时间,甚至改变块大小,例如使用
65536
131072
tokio::io::BufReader
进行测试,已经实现了
AsyncBufRead
,并且它通过
AsyncRead
,您可以使用
AsyncReadExt
读取
字节,这里声明了
fill_buf
的默认buf大小:它找不到
consume
方法,因为
consume
期望自己成为
Pin
@ÖmerErden你能帮我更好地理解
Pin
的方式和内容吗我正在努力理解这个想法,但仍然没有得到它,因为你是个傻瓜连续调用
read_to_end
read_to_end
将立即读取整个文件,然后每次调用后将读取0字节,您需要用read读取块,请检查:尝试使用
buf[…字节]
获取实际块