fast-des 0.5.0

This crate implements DES encryption and NetNTLMv1 hashing in bitsliced form. a 10x-100x improvement in speed can be achieved depending on hardware.
Documentation
use std::{env, sync::Arc, thread};

use fast_des::{
    benchmark::{benchmark, benchmark_parallel},
    bitsliced_des_inline_simd, bitsliced_des_simd, des,
};
use wide::u64x8;

const KEY: u64 = 0xABCDEF1234567890;
const PLAINTEXT: u64 = 0x8877665544332211;

fn main() {
    let args: Vec<String> = env::args().collect();
    if args.len() < 2 {
        println!("Usage: fast-des.exe <benchmark_name>");
    }
    let benchmark_name = &args[1];
    start_benchmark(benchmark_name.as_str());
}

fn start_benchmark(benchmark_name: &str) {
    match benchmark_name {
        "n" | "normal" | "normal_des" => {
            benchmark("normal_des", 100_000, 10000, 1, || {
                des(PLAINTEXT, KEY);
            });
        }
        "f" | "fast" | "fast_des" => {
            let mut keys = [[0x133457799BBCDFF1u64; 64]; 8];

            benchmark("fast_des_simd", 100_000, 10000, 64 * 8, || {
                bitsliced_des_simd(PLAINTEXT, &mut keys);
            });
        }
        "fp" | "fast_parallel" | "fast_des_parallel" => {
            let keys = [[0x133457799BBCDFF1u64; 64]; 8];
            let shared_keys = Arc::new(keys);
            benchmark_parallel("fast_des_simd", 100_000, 10000, 64 * 8, 16, move || {
                let keys = Arc::clone(&shared_keys);
                bitsliced_des_simd(PLAINTEXT, &keys);
            });
        }
        "fi" | "fast_inline" | "fast_des_inline" => {
            let mut keys = [u64x8::splat(0x133457799BBCDFF1u64); 64];

            benchmark("fast_des_inline_simd", 100_000, 10000, 64 * 8, || {
                bitsliced_des_inline_simd(PLAINTEXT, &mut keys);
            });
        }

        _ => {
            println!("Invalid benchmark name")
        }
    }
}