module Data.Digest.Pure.HashMD5
(
MD5Digest
, Hash(..)
, md5Init
, mixRaw
, mix
, mix3
, mix4
, mix5
, mixInt
, foldHash
) where
import Data.Digest.Pure.MD5
import Data.Char
mix5 ::
MD5Digest
-> MD5Digest
-> MD5Digest
-> MD5Digest
-> MD5Digest
-> MD5Digest
mix5 a (MD5Digest w0 w1 w2 w3) (MD5Digest w4 w5 w6 w7)
(MD5Digest w8 w9 w10 w11) (MD5Digest w12 w13 w14 w15)
= mixRaw a w0 w1 w2 w3 w4 w5 w6 w7 w8 w9 w10 w11 w12 w13 w14 w15
mix4 :: MD5Digest -> MD5Digest -> MD5Digest -> MD5Digest -> MD5Digest
mix4 a b c d = mix5 md5Init a b c d
mix3 :: MD5Digest -> MD5Digest -> MD5Digest -> MD5Digest
mix3 a b c = mix5 md5Init md5Init a b c
mix :: MD5Digest -> MD5Digest -> MD5Digest
mix a b = mix5 md5Init md5Init md5Init a b
class Hash a where
hash :: a -> MD5Digest
instance Hash MD5Digest where
hash = id
instance Hash Char where
hash c = mixRaw md5Init (fromIntegral $ ord c) 234124 23415 3452 0 0 0 0
0 0 0 0 0 0 0 0
instance (Hash a, Hash b) => Hash (a,b) where
hash (a, b) = mix (hash a) (hash b)
instance (Hash a, Hash b, Hash c) => Hash (a, b, c) where
hash (a, b, c) = mix3 (hash a) (hash b) (hash c)
instance (Hash a, Hash b, Hash c, Hash d) => Hash (a, b, c, d) where
hash (a, b, c, d) = mix4 (hash a) (hash b) (hash c) (hash d)
hashString :: String -> MD5Digest
hashString
= foldHash $ mixRaw md5Init 234 42 21 23 0 0 0 0 0 0 0 0 0 0 0 0
instance Hash a => Hash [a] where
hash = foldHash (hashString "Prelude.List standart")
foldHash :: Hash a => MD5Digest -> [a] -> MD5Digest
foldHash !acc [] = acc
foldHash !acc [a] = mix acc (hash a)
foldHash !acc [a,b] = mix3 acc (hash a) (hash b)
foldHash !acc [a,b,c] = mix4 acc (hash a) (hash b) (hash c)
foldHash !acc (a:b:c:d:rest) = foldHash (mix5 acc (hash a) (hash b) (hash c) (hash d)) rest
mixInt :: MD5Digest -> Int -> MD5Digest
mixInt h i = mixRaw h (fromIntegral i) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0