└── hash /hash: -------------------------------------------------------------------------------- 1 | use sha2::{Digest, Sha256}; 2 | use std::fs::File; 3 | use std::io::{BufReader, Read}; 4 | use std::sync::{Arc, Mutex}; 5 | use std::thread; 6 | 7 | fn hash_file(path: &str) -> String { 8 | let file = File::open(path).unwrap(); 9 | let mut reader = BufReader::new(file); 10 | let mut hasher = Sha256::new(); 11 | let mut buffer = [0; 1024]; 12 | 13 | while let Ok(bytes) = reader.read(&mut buffer) { 14 | if bytes == 0 { 15 | break; 16 | } 17 | hasher.update(&buffer[..bytes]); 18 | } 19 | 20 | format!("{:x}", hasher.finalize()) 21 | } 22 | 23 | fn main() { 24 | let paths = vec!["file1.txt", "file2.txt", "file3.txt"]; 25 | let results = Arc::new(Mutex::new(Vec::new())); 26 | let mut handles = vec![]; 27 | 28 | for path in paths { 29 | let results = Arc::clone(&results); 30 | let handle = thread::spawn(move || { 31 | let hash = hash_file(path); 32 | results.lock().unwrap().push((path.to_string(), hash)); 33 | }); 34 | handles.push(handle); 35 | } 36 | 37 | for handle in handles { 38 | handle.join().unwrap(); 39 | } 40 | 41 | for (file, hash) in results.lock().unwrap().iter() { 42 | println!("{}: {}", file, hash); 43 | } 44 | } 45 | hash 46 | --------------------------------------------------------------------------------