sha512

Pure Haskell SHA-512, HMAC-SHA512 (docs.ppad.tech/sha512).
git clone git://git.ppad.tech/sha512.git
Log | Files | Refs | README | LICENSE

commit 669c4ffd1cc7826876af2d67661738c2081ea6a9
parent ba7757cf61132cf3c3d79960f51ddaf4801f7aec
Author: Jared Tobin <jared@jtobin.io>
Date:   Mon, 22 Dec 2025 17:33:46 -0330

meta: add llvm flag

Diffstat:
MREADME.md | 28+++++++---------------------
Mflake.nix | 3+++
Mppad-sha512.cabal | 7+++++++
3 files changed, 17 insertions(+), 21 deletions(-)

diff --git a/README.md b/README.md @@ -63,33 +63,19 @@ Current benchmark figures on an M4 Silicon MacBook Air look like (use ``` benchmarking ppad-sha512/SHA512 (32B input)/hash - time 957.1 ns (956.3 ns .. 957.7 ns) + time 419.3 ns (419.1 ns .. 419.7 ns) 1.000 R² (1.000 R² .. 1.000 R²) - mean 956.1 ns (955.6 ns .. 956.6 ns) - std dev 1.714 ns (1.436 ns .. 2.174 ns) + mean 420.4 ns (420.1 ns .. 421.1 ns) + std dev 1.507 ns (843.5 ps .. 2.705 ns) benchmarking ppad-sha512/HMAC-SHA512 (32B input)/hmac - time 3.460 μs (3.448 μs .. 3.475 μs) + time 1.340 μs (1.339 μs .. 1.341 μs) 1.000 R² (1.000 R² .. 1.000 R²) - mean 3.474 μs (3.468 μs .. 3.478 μs) - std dev 16.60 ns (11.71 ns .. 24.66 ns) + mean 1.343 μs (1.342 μs .. 1.347 μs) + std dev 8.443 ns (3.955 ns .. 14.85 ns) ``` -Compare this to Hackage's venerable SHA package: - -``` - benchmarking ppad-sha512/SHA512 (32B input)/SHA.sha512 - time 1.437 μs (1.436 μs .. 1.437 μs) - 1.000 R² (1.000 R² .. 1.000 R²) - mean 1.440 μs (1.435 μs .. 1.452 μs) - std dev 23.57 ns (11.13 ns .. 43.08 ns) - - benchmarking ppad-sha512/HMAC-SHA512 (32B input)/SHA.hmacSha512 - time 5.164 μs (5.162 μs .. 5.166 μs) - 1.000 R² (1.000 R² .. 1.000 R²) - mean 5.159 μs (5.157 μs .. 5.161 μs) - std dev 6.522 ns (5.534 ns .. 7.662 ns) -``` +You should compile with the 'llvm' flag for maximum performance. ## Security diff --git a/flake.nix b/flake.nix @@ -25,6 +25,7 @@ pkgs = import nixpkgs { inherit system; }; hlib = pkgs.haskell.lib; + llvm = pkgs.llvmPackages_15.llvm; base16 = ppad-base16.packages.${system}.default; @@ -50,6 +51,7 @@ buildInputs = [ cabal cc + llvm ]; inputsFrom = builtins.attrValues self.packages.${system}; @@ -62,6 +64,7 @@ echo "cc: $(${cc}/bin/cc --version)" echo "ghc: $(${ghc}/bin/ghc --version)" echo "cabal: $(${cabal}/bin/cabal --version)" + echo "llc: $(${llvm}/bin/llc --version | head -2 | tail -1)" ''; }; } diff --git a/ppad-sha512.cabal b/ppad-sha512.cabal @@ -14,6 +14,11 @@ description: A pure implementation of SHA-512 and HMAC-SHA512 on strict and lazy ByteStrings, as specified by RFC's 6234 and 2104. +flag llvm + description: Use GHC's LLVM backend. + default: False + manual: True + source-repository head type: git location: git.ppad.tech/sha512.git @@ -23,6 +28,8 @@ library hs-source-dirs: lib ghc-options: -Wall + if flag(llvm) + ghc-options: -fllvm -O2 exposed-modules: Crypto.Hash.SHA512 build-depends: