[Haskell-cafe] Re: ANNOUNCE: hs-cryptohash 0.4

Maciej Piechotka uzytkownik2 at gmail.com
Fri Jul 2 07:51:38 EDT 2010


On Fri, 2010-07-02 at 20:10 +1000, Ivan Lazar Miljenovic wrote:
> Vincent Hanquez <tab at snarc.org> writes:
> 
> > On Fri, Jul 02, 2010 at 12:55:03PM +1000, Ivan Miljenovic wrote:
> >> On 1 July 2010 17:25, Vincent Hanquez <tab at snarc.org> wrote:
> >> > The main reason for this library is the lack of incremental api exposed by
> >> > current digest libraries, and filling the void about some missing digest
> >> > algorithms; Also the speed comes as a nice bonus.
> >> 
> >> Can you explain what you mean by "incremental API"?
> >
> > The incremental API is the init/update/finalize functions where you can call
> > update as many time as you need, instead of a single function "hash" where you
> > need to hash all your data in one-go.
> >
> > It's necessary in my case since i receive chunks of data to be hashed from the
> > network, and I don't want to carry a buffer of data (with potential security
> > issues), until i can hash everything.
> >
> > The few existing packages that exposes the incremental API, usually do it
> > in the IO monad; cryptohash do it purely, creating a new context as it get updated.
> > (this has a cost but remains fast globally with the C implementation)
> >
> > i.e.
> > 	update : ctx -> bytestring -> IO ()
> > becomes:
> > 	update : ctx -> bytestring -> ctx
> 
> So you're using explicit state parsing?  Any particular reason for not
> using the State monad or something like that?
> 

Wrapping it into State monad is trivial IMHO but such implementation is
trivial to use for example in foldl.

Also it allows to not jump in both direction if you need to use it
somewhere:

f ctx = do
   l <- getLine
   let !ctx = update ctx l
   l <- getLine
   let !ctx = update ctx l
   return ctx

vs.
(if it is forall m. StateT ctx m a)

f = execStateT $ do
   l <- lift $ getLine
   update l -- Alternativly: update =<< lift (getLine)
   l <- lift $ getLine
   update l

or

f ctx = do
   l <- getLine
   let !ctx = execState (update l)
   l <- getLine
   let !ctx = execState (update l)
   return ctx

Regards
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part
Url : http://www.haskell.org/pipermail/haskell-cafe/attachments/20100702/50c0a691/attachment.bin


More information about the Haskell-Cafe mailing list