summaryrefslogtreecommitdiffstats
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..bfed16b
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,80 @@
+mod iter;
+mod load_file;
+mod demo_hash;
+
+use num::BigInt;
+use num::bigint::Sign;
+
+fn vec_pop_cnt(v: &Vec<u8>) -> u32
+{
+ let mut cnt = 0;
+
+ for x in v
+ {
+ cnt += x.count_ones();
+ }
+
+ cnt
+}
+
+fn pop_cnt_vec(c: u32) -> Vec<u8>
+{
+ let mut v = Vec::new();
+ v.push(2u8.pow(c % 8) - 1);
+ for _ in 0..(c / 8)
+ {
+ v.push(0xff);
+ }
+
+ v
+}
+
+fn main()
+{
+ /* "Compression" setup */
+ let raw_file = load_file::load_file_vec(&"data.bin".to_owned()).unwrap();
+ let size = raw_file.len();
+ let popcnt = vec_pop_cnt(&raw_file);
+ let bi_file = BigInt::from_bytes_be(Sign::Plus, &raw_file);
+ let solution_hash = demo_hash::hash_bigint(size, &bi_file);
+
+ println!("Length: {}", size);
+ print!("SHA512: ");
+ demo_hash::show_hash(&solution_hash);
+ println!("popcnt: {}", popcnt);
+
+ /*
+ // , ,
+ for _ in 0..1000000
+ {
+ bi = iter::next(&bi);
+ }
+
+ println!("{:x}", bi);
+ panic!("stopping after benchmark");
+ */
+
+ //panic!("Performing compress only");
+
+ /* "Decompression" loop */
+ let raw = pop_cnt_vec(popcnt);
+ let mut bi = BigInt::from_bytes_be(Sign::Plus, &raw);
+
+ loop
+ {
+ let iteration_hash = demo_hash::hash_bigint(size, &bi);
+ //println!("{:b}", bi);
+ //println!();
+
+ if iteration_hash == solution_hash
+ {
+ demo_hash::show_hash(&iteration_hash);
+ break;
+ }
+
+ bi = iter::next(&bi);
+ }
+
+ println!("Found hash (data follows)!!!");
+ println!("{:x}", bi);
+}