The review of std.hash package
Regan Heath
regan at netmail.co.nz
Thu Aug 9 03:15:07 PDT 2012
On Thu, 09 Aug 2012 10:59:47 +0100, David Nadlinger <see at klickverbot.at>
wrote:
> On Wednesday, 8 August 2012 at 19:27:54 UTC, Walter Bright wrote:
>> The idea is to have hash act like a component - not with special added
>> code the user has to write.
>
> Sorry, but I think this is a meaningless statement without specifying
> what kind of interface the component should adhere to. In my opinion,
> the proposed std.hash design would be a perfectly valid interface for
> »accumulate stuff and at some point get a result«-type components.
>
>> 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.
>
> Hash functions are _not_ analogous to reduce(), because the operation
> performed by reduce() is stateless, whereas hash functions generally
> have some internal state.
>
> »Continuing« a reduce() operation by repeatedly calling it with the last
> partial result as the starting value is only possible because there is
> no additional state to carry over. To make this work with hashes, you'd
> have to return something encapsulating the internal state from your hash
> function.
This isn't necessarily a problem.
> But then, you again need to obtain the actual result from that return
> value from that result somehow, which defeats the original intent of
> making it work like reduce – and incidentally is what finish() does.
But, this is a problem. finish in most cases pads the remaining data to a
boundary of the internal state size, then completes one more iteration of
the algorithm to produce the final result.
So, like David has just said, you can have 1 or the other. Either you can
chain hashreduce operations together, but you have to perform a manual
finish step to get the actual result, or you cannot chain hashreduce
operations together and finish is done automatically when the input range
is consumed.
Wild thought.. and I have to admit I've not followed the proposed or
suggested API closely, nor have I used ranges extensively so this may not
be possible..
If the range/hash object stores the current state and returns this as the
result of hashreduce, it would be chainable. If it also had a "Digest"
property/method which performed finish on a /temporary copy/ of the state
it would almost be as automatic as reduce. There would still be a manual
step to get the result, but it would be analogous to calling toString on
any range object to output it's "value". The Digest property/method would
not modify the internal state, and could be called at any time between
(not sure there is a point to this) or after chained hashreduce operations.
R
--
Using Opera's revolutionary email client: http://www.opera.com/mail/
More information about the Digitalmars-d
mailing list