on master help sign in
Optimize uuid V3 & V5 performance

This results in a significant ~2x boost: Before ====== benchmarking generation/V3 time 1.493 μs (1.487 μs .. 1.500 μs) 1.000 R² (1.000 R² .. 1.000 R²) mean 1.490 μs (1.487 μs .. 1.496 μs) std dev 15.33 ns (12.46 ns .. 18.85 ns) benchmarking generation/V5 time 1.587 μs (1.586 μs .. 1.588 μs) 1.000 R² (1.000 R² .. 1.000 R²) mean 1.587 μs (1.586 μs .. 1.587 μs) std dev 2.642 ns (2.234 ns .. 3.272 ns) ---- After ===== benchmarking generation/V3 time 676.3 ns (675.2 ns .. 677.6 ns) 1.000 R² (1.000 R² .. 1.000 R²) mean 676.8 ns (676.1 ns .. 677.9 ns) std dev 2.920 ns (2.619 ns .. 3.210 ns) benchmarking generation/V5 time 713.0 ns (712.9 ns .. 713.2 ns) 1.000 R² (1.000 R² .. 1.000 R²) mean 713.1 ns (713.0 ns .. 713.3 ns) std dev 498.7 ps (361.2 ps .. 670.6 ps)

commit3be19b173301ee3017b125ac78ef0ace69fa7031 authorHerbert Valerio Riedel <hvr@gnu.org> dateSat 17 Dec 2016, 19:15 (10 years ago) parent000102a
4 files changed+8−8
uuid/Data/UUID/Named.hs+2−4 uuid/Data/UUID/V3.hs+2−2 uuid/Data/UUID/V5.hs+2−2 uuid/uuid.cabal+2
uuid/Data/UUID/Named.hs+2−4
@@ -33,21 +33,19 @@ import Data.Binary.Get (runGet, getWord32be)
3333import Data.Maybe
3434import Data.Word (Word8)
3535
36−import qualified Data.ByteArray as BA
3736import qualified Data.ByteString as B
3837import qualified Data.ByteString.Lazy as BL
3938
4039-- |Generate a 'UUID' within the specified namespace out of the given
4140-- object.
42−generateNamed :: BA.ByteArrayAccess bs
43− => (B.ByteString -> bs) -- ^Hash
41+generateNamed :: (B.ByteString -> B.ByteString) -- ^Hash
4442 -> Word8 -- ^Version
4543 -> UUID -- ^Namespace
4644 -> [Word8] -- ^Object
4745 -> UUID
4846generateNamed hash version namespace object =
4947 let chunk = B.pack $ toList namespace ++ object
50− bytes = BL.fromStrict . BA.convert $ hash chunk
48+ bytes = BL.fromChunks . (:[]) $ hash chunk
5149 w = getWord32be
5250 unpackBytes = runGet $
5351 buildFromWords version <$> w <*> w <*> w <*> w
uuid/Data/UUID/V3.hs+2−2
@@ -35,7 +35,7 @@ import Data.Word
3535
3636import Data.UUID.Types.Internal
3737import qualified Data.UUID.Named as Shared
38−import qualified Crypto.Hash as H
38+import qualified Crypto.Hash.MD5 as MD5
3939
4040
4141-- |Generate a 'UUID' within the specified namespace out of the given
@@ -46,4 +46,4 @@ import qualified Crypto.Hash as H
4646generateNamed :: UUID -- ^Namespace
4747 -> [Word8] -- ^Object
4848 -> UUID
49−generateNamed = Shared.generateNamed (H.hashWith H.MD5) 3
49+generateNamed = Shared.generateNamed MD5.hash 3
uuid/Data/UUID/V5.hs+2−2
@@ -30,7 +30,7 @@ import Data.Word
3030
3131import Data.UUID.Types.Internal
3232import qualified Data.UUID.Named as Shared
33−import qualified Crypto.Hash as H
33+import qualified Crypto.Hash.SHA1 as SHA1
3434
3535
3636-- |Generate a 'UUID' within the specified namespace out of the given
@@ -41,4 +41,4 @@ import qualified Crypto.Hash as H
4141generateNamed :: UUID -- ^Namespace
4242 -> [Word8] -- ^Object
4343 -> UUID
44−generateNamed = Shared.generateNamed (H.hashWith H.SHA1) 5
44+generateNamed = Shared.generateNamed SHA1.hash 5
uuid/uuid.cabal+2
@@ -32,6 +32,8 @@ Library
3232 Build-Depends: base >= 3 && < 5,
3333 binary >= 0.4 && < 0.9,
3434 bytestring >= 0.10 && < 0.11,
35+ cryptohash-sha1 >= 0.11.100 && < 0.12,
36+ cryptohash-md5 >= 0.11.100 && < 0.12,
3537 cryptonite >= 0.1 && < 0.21,
3638 memory >= 0.2 && < 0.14,
3739 network-info == 0.2.*,