module dcrypt.benchmark.DigestBenchmark;

import dcrypt.benchmark.Benchmark;
import dcrypt.crypto.digest;
import std.conv;

public class DigestBenchmark: Benchmark {
	
	private Digest digest;
	private size_t length;
	
	this (Digest d){
		digest = d;
	}

	@property
	static string[] header() {
		return ["algorithm", "speed MB/s"];
	}
	
	override string[] benchmark(ulong length) {
		StopWatch sw;
		digest.start();
		ubyte[32] block;
		
		sw.start();
		foreach(size_t i; 0 .. length/block.length) {
			digest.put(block);
			this.length += block.length;
		}
		sw.stop();
		ubyte[] hash = digest.finish();
		
		
		double speed = 1e9 * length / sw.peek().nsecs();
		speed *= 1e-6;
		return [digest.name, text(speed)];
	}
	
}