base58

Pure Haskell base58, base58check encoding/decoding (docs.ppad.tech/base58).
git clone git://git.ppad.tech/base58.git
Log | Files | Refs | README | LICENSE

commit 9aec2633bffce9944bb9647b58abe5072e5834a8
parent e36b0a81145b163bdf103d43e31392b272417cbe
Author: Jared Tobin <jared@jtobin.io>
Date:   Mon, 22 Dec 2025 20:02:06 -0330

meta: add llvm flag

Diffstat:
MREADME.md | 32++++++++++++++++++--------------
Mflake.lock | 11+++++++----
Mflake.nix | 13++++++++++---
Mppad-base58.cabal | 7+++++++
4 files changed, 42 insertions(+), 21 deletions(-)

diff --git a/README.md b/README.md @@ -50,30 +50,34 @@ Current benchmark figures on a M4 Silicon MacBook Air look like (use ``` benchmarking ppad-base58/base58/encode/hello world - time 356.9 ns (355.7 ns .. 359.2 ns) - 1.000 R² (1.000 R² .. 1.000 R²) - mean 357.4 ns (356.7 ns .. 359.4 ns) - std dev 3.439 ns (1.609 ns .. 6.911 ns) + time 350.3 ns (349.2 ns .. 352.0 ns) + 0.999 R² (0.997 R² .. 1.000 R²) + mean 353.0 ns (351.9 ns .. 354.9 ns) + std dev 4.705 ns (3.411 ns .. 7.449 ns) + variance introduced by outliers: 13% (moderately inflated) benchmarking ppad-base58/base58/decode/StV1DL6CwTryKyV - time 397.7 ns (397.2 ns .. 398.1 ns) - 1.000 R² (1.000 R² .. 1.000 R²) - mean 397.3 ns (397.1 ns .. 397.6 ns) - std dev 942.3 ps (752.8 ps .. 1.232 ns) + time 377.7 ns (373.7 ns .. 380.7 ns) + 0.999 R² (0.999 R² .. 1.000 R²) + mean 379.4 ns (376.8 ns .. 381.8 ns) + std dev 9.020 ns (7.823 ns .. 10.76 ns) + variance introduced by outliers: 32% (moderately inflated) benchmarking ppad-base58/base58check/encode/0x00, hello world - time 2.430 μs (2.428 μs .. 2.431 μs) + time 1.197 μs (1.195 μs .. 1.200 μs) 1.000 R² (1.000 R² .. 1.000 R²) - mean 2.433 μs (2.432 μs .. 2.434 μs) - std dev 4.715 ns (3.868 ns .. 5.971 ns) + mean 1.200 μs (1.198 μs .. 1.202 μs) + std dev 7.256 ns (6.187 ns .. 8.819 ns) benchmarking ppad-base58/base58check/decode/13vQB7B6MrGQZaxCqW9KER - time 2.500 μs (2.497 μs .. 2.504 μs) + time 1.222 μs (1.218 μs .. 1.225 μs) 1.000 R² (1.000 R² .. 1.000 R²) - mean 2.506 μs (2.503 μs .. 2.510 μs) - std dev 9.919 ns (7.444 ns .. 14.66 ns) + mean 1.220 μs (1.217 μs .. 1.223 μs) + std dev 9.566 ns (8.250 ns .. 11.28 ns) ``` +You should build with the 'llvm' flag for maximum performance. + ## Security This library aims at the maximum security achievable in a diff --git a/flake.lock b/flake.lock @@ -97,16 +97,19 @@ "ppad-nixpkgs", "nixpkgs" ], + "ppad-base16": [ + "ppad-base16" + ], "ppad-nixpkgs": [ "ppad-nixpkgs" ] }, "locked": { - "lastModified": 1740802974, - "narHash": "sha256-GTD9UrxwMa5zY7hxzDSXjKXKUwMK4r3FBHLG0nvgapk=", + "lastModified": 1766435555, + "narHash": "sha256-ysN0iRuBLSQrgWU3rCFUyq0NvRpug6DTBRZSlWbmI1A=", "ref": "master", - "rev": "ab0957e305dff0243dcab11e381470585849fd20", - "revCount": 94, + "rev": "a4c17689cd66e1ef35c667914765cb24c9a4b305", + "revCount": 96, "type": "git", "url": "git://git.ppad.tech/sha256.git" }, diff --git a/flake.nix b/flake.nix @@ -17,6 +17,7 @@ type = "git"; url = "git://git.ppad.tech/sha256.git"; ref = "master"; + inputs.ppad-base16.follows = "ppad-base16"; inputs.ppad-nixpkgs.follows = "ppad-nixpkgs"; }; flake-utils.follows = "ppad-nixpkgs/flake-utils"; @@ -32,13 +33,19 @@ pkgs = import nixpkgs { inherit system; }; hlib = pkgs.haskell.lib; + llvm = pkgs.llvmPackages_15.llvm; base16 = ppad-base16.packages.${system}.default; + sha256 = ppad-sha256.packages.${system}.default; + sha256-llvm = + hlib.addBuildTools + (hlib.enableCabalFlag sha256 "llvm") + [ llvm ]; hpkgs = pkgs.haskell.packages.ghc981.extend (new: old: { ppad-base16 = base16; - ppad-sha256 = sha256; + ppad-sha256 = sha256-llvm; ${lib} = new.callCabal2nixWithOptions lib ./. "--enable-profiling" { ppad-base16 = new.ppad-base16; ppad-sha256 = new.ppad-sha256; @@ -60,10 +67,9 @@ buildInputs = [ cabal cc + llvm ]; - inputsFrom = builtins.attrValues self.packages.${system}; - doBenchmark = true; shellHook = '' @@ -72,6 +78,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-base58.cabal b/ppad-base58.cabal @@ -13,6 +13,11 @@ extra-doc-files: CHANGELOG description: base58 and base58check encoding/decoding on strict bytestrings. +flag llvm + description: Use GHC's LLVM backend. + default: False + manual: True + source-repository head type: git location: git.ppad.tech/base58.git @@ -22,6 +27,8 @@ library hs-source-dirs: lib ghc-options: -Wall + if flag(llvm) + ghc-options: -fllvm -O2 exposed-modules: Data.ByteString.Base58 , Data.ByteString.Base58Check