#io-read #checksum #tokio #hashing #reader #hash #data

hashing-reader

一个std::io::Read和tokio::io::AsyncRead包装器,在读取数据时动态计算校验和

1个不稳定版本

0.1.0 2023年10月23日

#1994 in 密码学

自定义许可

11KB
152

Hashing Reader

hashing_reader是一个Rust包,提供了一个std::io::Readtokio::io::AsyncRead包装器,可以在读取数据时计算校验和。

它适用于任何实现了std::io::Readtokio::io::AsyncRead的对象,以及任何实现了Digest特质的哈希函数,如RustCrypto/hashes

当它达到文件末尾或遇到错误时,它将计算的哈希值通过通道发送。

用法

该库的用途可能包括我们想要验证可能不适合内存的大型文件的校验和的情况。

以下是一个基本示例

use std::io::Read;
use sha2::Sha256;
use hashing_reader::HashingReader;

let data = "some data to hash";
let reader = data.as_bytes();

let (hr, rx) = HashingReader::<_, Sha256>::new(reader);

let mut buf = Vec::new();
let _ = hr.read_to_end(&mut buf);

let hash = rx.recv().unwrap().unwrap();
println!("Hash: {:?}", hash);

API

HashingReader::new(reader:R) -> (Self, 接收器<Option<Vec<u8>>>)

使用指定的读取对象和哈希函数构建一个新的HashingReader

它返回一个由HashingReader和将发送哈希值的通道的接收器组成的元组。

Read for HashingReader

HashingReader实现了std::io::Read。从HashingReader读取数据时,它也会从底层读取器读取数据,并将读取的数据更新到哈希函数。

当底层读取器到达文件末尾或遇到错误时,计算的哈希值将发送到通道。

AsyncRead for HashingReader

HashingReader 还实现了 tokio::io::AsyncRead。其行为与 std::io::Read 相同。

测试

这个软件包已经经过彻底测试,以确保它能够准确计算阻塞和非阻塞读取器的哈希,并且正确地将哈希发送到通道。

注意

此软件包使用 std::sync::mpsc::channel 来发送哈希。当底层读取器达到文件末尾 (EOF) 时,读取数据的哈希将通过通道发送。

但是,在使用此库时有一些重要的注意事项

  1. 永远不会到达 EOF:如果底层读取器永远不会到达 EOF,例如,如果它是一个无限期保持打开的网络流,哈希将永远不会通过通道发送。在设计程序时,应考虑这一点,特别是如果您的用例可能涉及长时间运行或持续连接。

  2. 多个 EOF:根据数据源和读取器实现的细节,可能会遇到多个 EOF 信号。这可能会在特定类型的文件格式、复杂的自定义读取器或从间歇性连接的源读取时发生。在这种情况下,每次遇到 EOF 都会发送一个新的哈希。准备好处理通过通道传入的多个哈希,并理解每个哈希对应于从读取开始到遇到 EOF 的单独数据块。

  3. 错误处理:如果在从底层读取器读取时发生错误,read 方法将返回 Err 结果,并且通过通道发送 None。请务必检查从通道接收到的 None 值,因为这表明读取操作期间发生了错误。

许可证

本项目受 MIT 许可证许可。有关详细信息,请参阅 LICENSE 文件。

依赖关系

~2.6–4MB
~72K SLoC