1
0
Fork 0
mirror of synced 2024-06-18 18:34:54 +12:00

Partial hashing

This commit is contained in:
Rafał Mikrut 2023-03-28 20:27:41 +02:00
parent 8a54a5e3c6
commit b61bd09860

View file

@ -459,7 +459,7 @@ impl DuplicateFinder {
} }
} }
self.check_references_for_size(); self.filter_reference_folders_by_size();
self.calculate_size_stats(); self.calculate_size_stats();
Common::print_time(start_time, SystemTime::now(), "check_files_size"); Common::print_time(start_time, SystemTime::now(), "check_files_size");
@ -490,7 +490,7 @@ impl DuplicateFinder {
/// This step check for references, only when checking for size. /// This step check for references, only when checking for size.
/// This is needed, because later reference folders looks for hashes, not size /// This is needed, because later reference folders looks for hashes, not size
fn check_references_for_size(&mut self) { fn filter_reference_folders_by_size(&mut self) {
if self.use_reference_folders && self.check_method == CheckingMethod::Size { if self.use_reference_folders && self.check_method == CheckingMethod::Size {
let mut btree_map = Default::default(); let mut btree_map = Default::default();
mem::swap(&mut self.files_with_identical_size, &mut btree_map); mem::swap(&mut self.files_with_identical_size, &mut btree_map);
@ -521,7 +521,7 @@ impl DuplicateFinder {
} }
} }
// TODO Generalize this if possible // TODO Generalize this if possible with different tools
fn prepare_hash_thread_handler( fn prepare_hash_thread_handler(
&self, &self,
progress_sender: Option<&futures::channel::mpsc::UnboundedSender<ProgressData>>, progress_sender: Option<&futures::channel::mpsc::UnboundedSender<ProgressData>>,
@ -556,15 +556,15 @@ impl DuplicateFinder {
} }
} }
/// The slowest checking type, which must be applied after checking for size fn prehashing(
fn check_files_hash(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&futures::channel::mpsc::UnboundedSender<ProgressData>>) -> bool { &mut self,
assert_eq!(self.check_method, CheckingMethod::Hash); stop_receiver: Option<&Receiver<()>>,
progress_sender: Option<&futures::channel::mpsc::UnboundedSender<ProgressData>>,
let check_type = Arc::new(self.hash_type); pre_checked_map: &mut BTreeMap<u64, Vec<FileEntry>>,
) -> Option<()> {
let start_time: SystemTime = SystemTime::now(); let start_time: SystemTime = SystemTime::now();
let check_type = self.hash_type;
let check_was_stopped = AtomicBool::new(false); // Used for breaking from GUI and ending check thread let check_was_stopped = AtomicBool::new(false); // Used for breaking from GUI and ending check thread
let mut pre_checked_map: BTreeMap<u64, Vec<FileEntry>> = Default::default();
let progress_thread_run = Arc::new(AtomicBool::new(true)); let progress_thread_run = Arc::new(AtomicBool::new(true));
let atomic_file_counter = Arc::new(AtomicUsize::new(0)); let atomic_file_counter = Arc::new(AtomicUsize::new(0));
@ -577,8 +577,6 @@ impl DuplicateFinder {
self.files_with_identical_size.values().map(Vec::len).sum(), self.files_with_identical_size.values().map(Vec::len).sum(),
); );
///////////////////////////////////////////////////////////////////////////// PREHASHING START
{
let loaded_hash_map; let loaded_hash_map;
let mut records_already_cached: BTreeMap<u64, Vec<FileEntry>> = Default::default(); let mut records_already_cached: BTreeMap<u64, Vec<FileEntry>> = Default::default();
let mut non_cached_files_to_check: BTreeMap<u64, Vec<FileEntry>> = Default::default(); let mut non_cached_files_to_check: BTreeMap<u64, Vec<FileEntry>> = Default::default();
@ -653,7 +651,7 @@ impl DuplicateFinder {
// Check if user aborted search(only from GUI) // Check if user aborted search(only from GUI)
if check_was_stopped.load(Ordering::Relaxed) { if check_was_stopped.load(Ordering::Relaxed) {
return false; return None;
} }
// Add data from cache // Add data from cache
@ -695,15 +693,34 @@ impl DuplicateFinder {
save_hashes_to_file(&save_cache_to_hashmap, &mut self.text_messages, &self.hash_type, true, self.minimal_prehash_cache_file_size); save_hashes_to_file(&save_cache_to_hashmap, &mut self.text_messages, &self.hash_type, true, self.minimal_prehash_cache_file_size);
} }
Common::print_time(start_time, SystemTime::now(), "check_files_hash - prehash");
Some(())
}
fn full_hashing(&mut self) {}
/// The slowest checking type, which must be applied after checking for size
fn check_files_hash(&mut self, stop_receiver: Option<&Receiver<()>>, progress_sender: Option<&futures::channel::mpsc::UnboundedSender<ProgressData>>) -> bool {
assert_eq!(self.check_method, CheckingMethod::Hash);
let check_type = self.hash_type;
let check_was_stopped = AtomicBool::new(false); // Used for breaking from GUI and ending check thread
///////////////////////////////////////////////////////////////////////////// PREHASHING START
let mut pre_checked_map: BTreeMap<u64, Vec<FileEntry>> = Default::default();
let ret = self.prehashing(stop_receiver, progress_sender, &mut pre_checked_map);
if ret.is_none() {
return false;
} }
///////////////////////////////////////////////////////////////////////////// PREHASHING END ///////////////////////////////////////////////////////////////////////////// PREHASHING END
Common::print_time(start_time, SystemTime::now(), "check_files_hash - prehash");
let start_time: SystemTime = SystemTime::now();
///////////////////////// /////////////////////////
let start_time: SystemTime = SystemTime::now();
//// PROGRESS THREAD START //// PROGRESS THREAD START
let progress_thread_run = Arc::new(AtomicBool::new(true)); let progress_thread_run = Arc::new(AtomicBool::new(true));
let atomic_file_counter = Arc::new(AtomicUsize::new(0)); let atomic_file_counter = Arc::new(AtomicUsize::new(0));