module Data.UUID.V3
(generateNamed
,Shared.namespaceDNS
,Shared.namespaceURL
,Shared.namespaceOID
,Shared.namespaceX500
) where
import Data.Word
import Data.Bits
import Data.UUID.Internal
import qualified Data.UUID.Named as Shared
import qualified Data.Digest.MD5 as MD5
generateNamed :: UUID
-> [Word8]
-> UUID
generateNamed = Shared.generateNamed hash 3
hash :: [Word8] -> (Word32, Word32, Word32, Word32)
hash bytes
= case map f $ chunk 4 $ MD5.hash bytes of
w1:w2:w3:w4:_ -> (w1, w2, w3, w4)
_ -> error "Data.UUID.V3.hash: fatal error"
where f [b1, b2, b3, b4]
= sum
[ fromIntegral b4
, fromIntegral b3 `shiftL` 8
, fromIntegral b2 `shiftL` 16
, fromIntegral b1 `shiftL` 24
]
f _ = error "Data.UUID.V3.hash: fatal error"
chunk :: Int -> [a] -> [[a]]
chunk n = go n []
where go _ [] [] = []
go _ ys [] = reverse ys:[]
go 0 ys xs = reverse ys:go n [] xs
go m ys (x:xs) = go (m1) (x:ys) xs