Как асинхронно вычислить контрольную сумму файла на жестком диске в Rust? - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть файловый сервер TCP в стеке Rust / Tokio.

Когда клиент загружает файл, данные читаются из tokio::net::TcpStream и записываются в futures_fs::FsWriteSink, который былзапущен на отдельной futures_fs::FsPool.

Когда файл полностью загружен, мне нужно проверить его непротиворечивость, сверяя контрольную сумму с контрольной суммой, отправленной клиентом.

Какой самый простой способасинхронно вычислить контрольную сумму, особенно если файл не помещается в оперативную память?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

На самом деле, делать простые алгоритмы хеширования асинхронными в таких случаях несколько избыточно, если одно вычисление MD5 занимает менее 1 мкс (около 500 нс).

Но теперь появился новый blocking APIдоступно в tokio.Это позволяет выполнять блокирующие или загруженные процессором операции с использованием внутренних механизмов потоков.

0 голосов
/ 21 ноября 2018

Это зависит от того, какой алгоритм контрольной суммы вы хотите использовать, но, например, 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();
...