diff options
author | Lars Wirzenius <liw@sequoia-pgp.org> | 2022-04-10 11:25:10 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@sequoia-pgp.org> | 2022-04-10 11:25:10 +0300 |
commit | 4f16e3e23b8e1ab6bb0d2387626ae7cd747b10df (patch) | |
tree | 8f52b285d67005af34d9d6ef29caa384eaace91b | |
parent | d8e2d9927d1e93efe737e2e3e0986bf8c49d953a (diff) | |
download | checksums-4f16e3e23b8e1ab6bb0d2387626ae7cd747b10df.tar.gz |
refactor, add rayon
Sponsored-by: author
-rw-r--r-- | Cargo.toml | 3 | ||||
-rw-r--r-- | src/main.rs | 80 |
2 files changed, 30 insertions, 53 deletions
@@ -1,5 +1,5 @@ [package] -name = "checksums_threads" +name = "checksums" version = "0.1.0" edition = "2021" @@ -8,4 +8,5 @@ edition = "2021" [dependencies] anyhow = "1.0.56" clap = { version = "3.1.6", features = ["derive"] } +rayon = "1.5.1" sha2 = "0.10.2" diff --git a/src/main.rs b/src/main.rs index 2f3fbff..43ad299 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,69 +1,45 @@ use clap::Parser; -use sha2::{Digest, Sha256}; -use std::fs::File; -use std::io::{BufReader, Read}; -use std::path::{Path, PathBuf}; - -const BUF_SIZE: usize = 4096; +use rayon::prelude::*; +use std::path::PathBuf; +use checksums::*; fn main() { let args = Args::parse(); - if let Err(e) = checksums_main(&args.filenames) { + + if let Err(e) = checksums_linear(&args.filenames) { eprintln!("ERROR: {e}"); std::process::exit(1); } -} -fn checksums_main(filenames: &[PathBuf]) -> anyhow::Result<()> { - let checksums: Result<Vec<FileChecksum>, std::io::Error> = filenames - .iter() - .map(|filename| checksum(filename)) - .collect(); - for c in checksums? { - c.print(); + println!(); + if let Err(e) = checksums_rayon(&args.filenames) { + eprintln!("ERROR: {e}"); + std::process::exit(1); } - Ok(()) } -fn checksum(filename: &Path) -> Result<FileChecksum, std::io::Error> { - let mut checksum = Sha256::new(); - - let file = File::open(filename)?; - let mut reader = BufReader::new(file); - loop { - let mut buf = vec![0; BUF_SIZE]; - let n = reader.read(&mut buf)?; - if n == 0 { - break; - } - checksum.update(&buf[..n]); +fn print(checksums: &[FileChecksum]) { + for c in checksums { + c.print(); } - - let checksum = checksum.finalize(); - let checksum = format!("{checksum:x}"); - Ok(FileChecksum::new(filename, checksum)) } -#[derive(Parser)] -struct Args { - filenames: Vec<PathBuf>, -} - -#[derive(Debug)] -struct FileChecksum { - filename: PathBuf, - checksum: String, +fn checksums_linear(filenames: &[PathBuf]) -> anyhow::Result<()> { + println!("linear"); + let checksums: Result<Vec<FileChecksum>, std::io::Error> = filenames + .iter() + .map(|filename| checksum(filename)) + .collect(); + print(&checksums?); + Ok(()) } -impl FileChecksum { - fn new(filename: &Path, checksum: String) -> Self { - Self { - filename: filename.to_path_buf(), - checksum, - } - } - - fn print(&self) { - println!("{} {}", self.checksum, self.filename.display()); - } +fn checksums_rayon(filenames: &[PathBuf]) -> anyhow::Result<()> { + println!("rayon"); + let checksums: Result<Vec<FileChecksum>, std::io::Error> = filenames + .par_iter() + .map(|filename| checksum(filename)) + .collect(); + print(&checksums?); + Ok(()) } |