module Network.AdHoc.MessageID
(MessageID
,MessageIDGenerator
,counter
,scrambler
,hasher
) where
import Data.List as List
import qualified Data.Digest.SHA512 as SHA512
import qualified Codec.Binary.Base64 as Base64
import Codec.Utils
import System.Random
type MessageID = String
type MessageIDGenerator g = g -> [MessageID]
counter :: MessageIDGenerator g
counter _ = fmap show [(0::Int)..]
scrambler :: RandomGen g => Int -> MessageIDGenerator g
scrambler offset gen = fmap show $ scramble gen offset [(0::Int)..]
hasher :: RandomGen g => MessageIDGenerator g
hasher gen = fmap ((Base64.encode).(SHA512.hash)) (zipWith (++) (fmap (toOctets (256::Int)) [(0::Int)..]) (fmap toTwosComp (randoms gen::[Int])))
scramble :: RandomGen g => g -> Int -> [a] -> [a]
scramble gen offset xs = let
(r, gen') = randomR (0, offset) gen
(left, x:right) = List.splitAt r xs
xs' = scramble gen' offset (left ++ right)
in x : xs'