diff options
-rw-r--r-- | Cargo.toml | 7 | ||||
-rw-r--r-- | benches/hashrate.rs | 137 |
2 files changed, 143 insertions, 1 deletions
@@ -22,4 +22,9 @@ md4 = "0.10.2" md-5 = "0.10.5" sha-1 = "0.10.0" sha2 = "0.10.6" -ripemd = "0.1.3"
\ No newline at end of file +ripemd = "0.1.3" +criterion = "0.4.0" + +[[bench]] +name = "hashrate" +harness = false
\ No newline at end of file diff --git a/benches/hashrate.rs b/benches/hashrate.rs new file mode 100644 index 0000000..2bb0f97 --- /dev/null +++ b/benches/hashrate.rs @@ -0,0 +1,137 @@ +use criterion::{black_box, criterion_group, criterion_main, Criterion}; +use passwordmaker_rs::{PasswordMaker, Hasher, HasherList, HashAlgorithm, LeetLevel}; + +//We want to bench the surrounding string manipulation, not the hashers. +//For this reason, we fake them with a black_box. + +struct MockMd4; +struct MockMd5; +struct MockSha1; +struct MockSha256; +struct MockRipeMD160; +impl Hasher for MockMd4{ + type Output = [u8;16]; + fn hash(_data : &[u8]) -> Self::Output { + black_box([156u8,4u8,123u8,54u8,91u8,85u8,34u8,159u8,243u8,210u8,35u8,41u8,31u8,34u8,75u8,94u8]) + } +} +impl Hasher for MockMd5{ + type Output = [u8;16]; + fn hash(_data : &[u8]) -> Self::Output { + black_box([156u8,4u8,123u8,54u8,91u8,85u8,34u8,159u8,243u8,210u8,35u8,41u8,31u8,34u8,75u8,94u8]) + } +} +impl Hasher for MockSha1{ + type Output = [u8;20]; + fn hash(_data : &[u8]) -> Self::Output { + black_box([156u8,4u8,123u8,54u8,91u8,85u8,34u8,159u8,243u8,210u8,35u8,41u8,31u8,34u8,75u8,94u8,46,49,13,24]) + } +} +impl Hasher for MockSha256{ + type Output = [u8;32]; + fn hash(_data : &[u8]) -> Self::Output { + black_box([156u8,4u8,123u8,54u8,91u8,85u8,34u8,159u8,243u8,210u8,35u8,41u8,31u8,34u8,75u8,94u8,156u8,4u8,123u8,54u8,91u8,85u8,34u8,159u8,243u8,210u8,35u8,41u8,31u8,34u8,75u8,94u8]) + } +} +impl Hasher for MockRipeMD160{ + type Output = [u8;20]; + fn hash(_data : &[u8]) -> Self::Output { + black_box([156u8,4u8,123u8,54u8,91u8,85u8,34u8,159u8,243u8,210u8,35u8,41u8,31u8,34u8,75u8,94u8,46,49,13,24]) + } +} + +impl passwordmaker_rs::Md4 for MockMd4{} +impl passwordmaker_rs::Md5 for MockMd5{} +impl passwordmaker_rs::Sha1 for MockSha1{} +impl passwordmaker_rs::Sha256 for MockSha256{} +impl passwordmaker_rs::Ripemd160 for MockRipeMD160{} + +struct MockHashes{} +impl HasherList for MockHashes { + type MD4 = MockMd4; + type MD5 = MockMd5; + type SHA1 = MockSha1; + type SHA256 = MockSha256; + type RIPEMD160 = MockRipeMD160; +} + +type Pwm<'a> = PasswordMaker<'a, MockHashes>; + +fn criterion_bench_32bit(c: &mut Criterion) { + let pwm = Pwm::new( + HashAlgorithm::Sha256, + passwordmaker_rs::UseLeetWhenGenerating::NotAtAll, + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`~!@#$%^&*()_-+={}|[]\\:\";'<>?,./", + "", + "", + 150, + "", + "" + ).unwrap(); + c.bench_function("32 bytes", |b| b.iter(|| { + pwm.generate( + black_box("This is a long string. With many, many characters. For no particular reason.".to_owned()), + black_box("And another relatively long string for no reason other than it being long.".to_owned()) + ) + })); +} + +fn criterion_bench_16bit(c: &mut Criterion) { + let pwm = Pwm::new( + HashAlgorithm::Md5, + passwordmaker_rs::UseLeetWhenGenerating::NotAtAll, + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`~!@#$%^&*()_-+={}|[]\\:\";'<>?,./", + "", + "", + 150, + "", + "" + ).unwrap(); + c.bench_function("16 bytes", |b| b.iter(|| { + pwm.generate( + black_box("This is a long string. With many, many characters. For no particular reason.".to_owned()), + black_box("And another relatively long string for no reason other than it being long.".to_owned()) + ) + })); +} + +fn criterion_bench_16bit_post_leet(c: &mut Criterion) { + let pwm = Pwm::new( + HashAlgorithm::Md5, + passwordmaker_rs::UseLeetWhenGenerating::After { level: LeetLevel::Six }, + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`~!@#$%^&*()_-+={}|[]\\:\";'<>?,./", + "", + "", + 150, + "", + "" + ).unwrap(); + c.bench_function("16 bytes with post_leet", |b| b.iter(|| { + pwm.generate( + black_box("This is a long string. With many, many characters. For no particular reason.".to_owned()), + black_box("And another relatively long string for no reason other than it being long.".to_owned()) + ) + })); +} + +fn criterion_bench_16bit_pre_leet(c: &mut Criterion) { + let pwm = Pwm::new( + HashAlgorithm::Md5, + passwordmaker_rs::UseLeetWhenGenerating::Before { level: LeetLevel::Six }, + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`~!@#$%^&*()_-+={}|[]\\:\";'<>?,./", + "", + "", + 150, + "", + "" + ).unwrap(); + c.bench_function("16 bytes with pre_leet", |b| b.iter(|| { + pwm.generate( + black_box("This is a long string. With many, many characters. For no particular reason.".to_owned()), + black_box("And another relatively long string for no reason other than it being long.".to_owned()) + ) + })); +} + +criterion_group!(benches, criterion_bench_32bit, criterion_bench_16bit, criterion_bench_16bit_post_leet, criterion_bench_16bit_pre_leet); +criterion_main!(benches); |