summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@sequoia-pgp.org>2022-04-10 11:25:10 +0300
committerLars Wirzenius <liw@sequoia-pgp.org>2022-04-10 11:25:10 +0300
commit4f16e3e23b8e1ab6bb0d2387626ae7cd747b10df (patch)
tree8f52b285d67005af34d9d6ef29caa384eaace91b
parentd8e2d9927d1e93efe737e2e3e0986bf8c49d953a (diff)
downloadchecksums-4f16e3e23b8e1ab6bb0d2387626ae7cd747b10df.tar.gz
refactor, add rayon
Sponsored-by: author
-rw-r--r--Cargo.toml3
-rw-r--r--src/main.rs80
2 files changed, 30 insertions, 53 deletions
diff --git a/Cargo.toml b/Cargo.toml
index dffbe19..fd7084f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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(())
}