hs-blake2-0.0.1: src/Crypto/Hash/Tsuraan/Blake2.hs
{-# LANGUAGE OverloadedStrings #-}
module Crypto.Hash.Tsuraan.Blake2
( hash
, hash_key
) where
import Data.ByteString ( ByteString, length )
import Prelude hiding ( length )
import qualified Crypto.Hash.Tsuraan.Blake2.Parallel as Par
import qualified Crypto.Hash.Tsuraan.Blake2.Serial as Ser
-- | Hash a strict 'ByteString' into a digest 'ByteString' using a key. This
-- will choose to use parallel or serial Blake2 depending on the size of the
-- input 'ByteString'.
hash_key :: ByteString -- ^The key to use when hashing
-> Int -- ^The digest size to generate; must be 1-64
-> ByteString -- ^The 'ByteString' to hash
-> ByteString
hash_key key hashlen bytes =
if length bytes < cutoff
then Ser.hash_key key hashlen bytes
else Par.hash_key key hashlen bytes
-- | Hash a strict 'ByteString' into a digest 'ByteString'. This will choose to
-- use parallel or serial Blake2 depending on the size of the input
-- 'ByteString'
hash :: Int -- ^The digest size to generate; must be 1-64
-> ByteString -- ^The 'ByteString' to hash
-> ByteString
hash hashlen bytes =
if length bytes < cutoff
then Ser.hash hashlen bytes
else Par.hash hashlen bytes
-- This is a fairly sane cross-over point for when a hash is faster to
-- calculate in parallel than serially. This was found through experimentation,
-- so there's probably a smarter way to deal with it.
cutoff :: Int
cutoff = 5000