Partial hashing
This commit is contained in:
parent
8a54a5e3c6
commit
b61bd09860
|
@ -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));
|
||||||
|
|
Loading…
Reference in a new issue