parent
69edfe4e14
commit
e57b327c57
@ -0,0 +1,10 @@ |
||||
e4820b45d2277f3844eac66c903e84be |
||||
23170acc097c24edb98fc5488ab033fe |
||||
4a9f51db2c7eba0c724499f749d3176a |
||||
665e5bcb0c20062fe8abaaf4628bb154 |
||||
e8a2cbb6206fc937082bb92e4ed9cd3d |
||||
74a613b8c64fb216dc22d4f2bd4965f4 |
||||
ccb5ed231ba04d750c963668391d1e61 |
||||
d864ae0e66c89cb78345967cb2f3ab6b |
||||
2b56477105d91076030e877c94dd9776 |
||||
732442feac8b5013e16a776486ac5447 |
@ -0,0 +1,48 @@ |
||||
use packed_simd::u8x32; |
||||
use crate::anagram_logger::log_anagram; |
||||
use crate::dictionary_builder::Dictionary; |
||||
use crate::hash_computer::CHUNK_SIZE; |
||||
use crate::hash_computer::find_hashes; |
||||
use crate::permutations_cache::PermutationsCache; |
||||
|
||||
fn generate_vector_substitutions<'a>(simple_dictionary: &'a Dictionary, permutation: &'a [usize], current_phrase: u8x32, current_phrase_length: usize) -> Box<dyn Iterator<Item = u8x32> + 'a> { |
||||
if permutation.len() == 0 { |
||||
return Box::new(std::iter::once(current_phrase.clone())); |
||||
} |
||||
|
||||
let result = simple_dictionary.words[permutation[0]].iter() |
||||
.flat_map(move |word_info| { |
||||
generate_vector_substitutions(&simple_dictionary, &permutation[1..], current_phrase ^ word_info.get_simd_word_for_offset(current_phrase_length), current_phrase_length + word_info.length + 1).into_iter() |
||||
}); |
||||
return Box::new(result); |
||||
} |
||||
|
||||
fn process_anagram_chunk(chunk: &[u8x32; CHUNK_SIZE], phrase_length: usize, hashes_to_find: &[u32]) -> () { |
||||
match find_hashes(chunk, phrase_length, hashes_to_find) { |
||||
Some(anagrams) => { |
||||
for anagram in anagrams { |
||||
log_anagram(anagram, phrase_length); |
||||
} |
||||
} |
||||
_ => () |
||||
} |
||||
} |
||||
|
||||
pub fn analyze_anagrams(anagram_vector: &Vec<usize>, dictionary: &Dictionary, permutations: &PermutationsCache, phrase_length: usize, hashes_to_find: &[u32]) -> () { |
||||
let mut chunk: [u8x32; CHUNK_SIZE] = [u8x32::splat(0); CHUNK_SIZE]; |
||||
let mut chunk_position: usize = 0; |
||||
|
||||
permutations.get_permuted_vectors(&anagram_vector).iter() |
||||
.flat_map(|permuted_vector| { |
||||
generate_vector_substitutions(&dictionary, &permuted_vector, u8x32::splat(0), 0) |
||||
}) |
||||
.for_each(|anagram| { |
||||
chunk[chunk_position] = anagram; |
||||
chunk_position = (chunk_position + 1) % CHUNK_SIZE; |
||||
if chunk_position == 0 { |
||||
process_anagram_chunk(&chunk, phrase_length, hashes_to_find); |
||||
} |
||||
}); |
||||
|
||||
process_anagram_chunk(&chunk, phrase_length, hashes_to_find); |
||||
} |
@ -1,38 +1,15 @@ |
||||
use md5; |
||||
use packed_simd::u8x32; |
||||
use crate::dictionary_builder::Dictionary; |
||||
use crate::dictionary_builder::WordInfo; |
||||
use crate::permutations_cache::PermutationsCache; |
||||
|
||||
fn get_anagram_view_from_simd(simd_vector: u8x32, phrase_length: usize) -> String { |
||||
fn get_anagram_string_from_simd(simd_vector: u8x32, phrase_length: usize) -> String { |
||||
let mut string_bytes: [u8; 32] = [0; 32]; |
||||
simd_vector.write_to_slice_unaligned(&mut string_bytes); |
||||
|
||||
String::from_utf8_lossy(&string_bytes[0..phrase_length]).into_owned() |
||||
} |
||||
|
||||
fn generate_vector_substitutions<'a>(simple_dictionary: &'a Vec<Vec<&WordInfo>>, permutation: &'a [usize], current_phrase: u8x32, current_phrase_length: usize) -> Box<dyn Iterator<Item = u8x32> + 'a> { |
||||
if permutation.len() == 0 { |
||||
return Box::new(std::iter::once(current_phrase.clone())); |
||||
} |
||||
|
||||
let result = simple_dictionary[permutation[0]].iter() |
||||
.flat_map(move |&word_info| { |
||||
generate_vector_substitutions(&simple_dictionary, &permutation[1..], current_phrase ^ word_info.get_simd_word_for_offset(current_phrase_length), current_phrase_length + word_info.length + 1).into_iter() |
||||
}); |
||||
return Box::new(result); |
||||
} |
||||
|
||||
pub fn log_anagrams(anagram_vector: &Vec<usize>, dictionary: &Dictionary, permutations: &PermutationsCache, phrase_length: usize) -> () { |
||||
let simple_vector: Vec<usize> = (0..anagram_vector.len()).collect(); |
||||
let simple_dictionary: Vec<Vec<&WordInfo>> = (0..anagram_vector.len()) |
||||
.map(|i| dictionary.words[anagram_vector[i]].iter().map(|word_info| word_info).collect()) |
||||
.collect(); |
||||
|
||||
permutations.get_permuted_vectors(&simple_vector).iter() |
||||
.flat_map(|permuted_vector| { |
||||
generate_vector_substitutions(&simple_dictionary, &permuted_vector, u8x32::splat(0), 0) |
||||
}) |
||||
.for_each(|anagram| { |
||||
println!("{}", get_anagram_view_from_simd(anagram, phrase_length)); |
||||
}) |
||||
pub fn log_anagram(simd_vector: u8x32, phrase_length: usize) -> () { |
||||
let anagram_string = get_anagram_string_from_simd(simd_vector, phrase_length); |
||||
let hash = md5::compute(anagram_string.as_bytes()); |
||||
println!("{:x} {}", hash, anagram_string); |
||||
} |
Loading…
Reference in new issue