Am Wed, 08 Aug 2012 12:27:39 -0700 schrieb Walter Bright <newshou...@digitalmars.com>:
> On 8/8/2012 12:08 PM, Johannes Pfau wrote: > > No where's the difference, except that for hashes the context > > ('hash') has to be setup and finished manually? > > > The idea is to have hash act like a component - not with special > added code the user has to write. Please explain that. Nobody's going to simply replace a call to reduce with a call to a fictional 'hashReduce'. Why is it so important that reduce + hash API's match 100% even if the API doesn't fit hashes? > > In this case, it needs to work like a reduce algorithm, because it is > a reduce algorithm. Need to find a way to make this work. > We could do some ugly, performance killing hacks to make it possible, but I just don't see why this is necessary. ---- struct InterHash { MD5 ctx; ubyte[16] finished; alias finished this; } InterHash hashReduce(Range)(Range data) { InterHash hash; hash.ctx.start(); return hashReduce(hash, data); } InterHash hashReduce(Range)(InterHash hash, Range data) { copy(data, hash); auto ctxCopy = hash.ctx; hash.finished = ctxCopy.finish(); return hash; } auto a = hashReduce([1,2,3]); auto b = hashReduce(a, [3,4]); ---- However, a and b are still not really valid hash values. I just don't see why we should force an interface onto hashes which just doesn't fit.