It should accept an input range. But using an Output Range confuses me.
A hash function is a reduce algorithm - it accepts a sequence of input
values, and produces a single value. You should be able to write code
like:
ubyte[] data;
...
auto crc = data.crc32();
For example, the hash example given is:
foreach (buffer; file.byChunk(4096 * 1024))
hash.put(buffer);
auto result = hash.finish();
Instead it should be something like:
auto result = file.byChunk(4096 * 1025).joiner.hash();
I think sha1Of/digest!SHA1 should do this.
It's also important to have a stateful hash implementation that can be
updated incrementally, e.g. from a callback.