HORIZON HASKELLDocslts/ghc-9.10.xc74966e2026-09-27Search names, modules, packages, or :: a typeCtrl K

GHC 9.10.3 · lts/ghc-9.10.x · c74966e · 2026-09-27

Moduledistribution-nixpkgs-1.7.1.1Haskell2010

Distribution.Nixpkgs.Hashes

Render SHA message digests in the peculiar base32'ish format used by Nix.

  • 2 values

Render a SHA265 message digest into the somewhat unusual base32 scheme used by Nix. That algorithm is remarkable, because it twists the bits of the input buffer around quite a bit before grouping them into quintets that are then translated into the target alphabet 0123456789abcdfghijklmnpqrsvwxyz.

Basically, the sequence of bits

 255 254 253 252 251 250 249 248   ...   7  6  5  4  3  2  1  0
|_______________________________|       |______________________|
            byte 0                              byte 31

is split into quintets as follows:

              7   6  5  4  3  2   1 0 14 13 12  ...  251 252 253 254 255
|______________| |_____________| |____________|     |___________________|
   quintet 0        quintet 1      quintet 2             quintet 51

before the encoding takes place. This leads to somewhat surprising results:

Example3 expressions
printSHA256 (packHex "0000000000000000000000000000000000000000000000000000000000000080")"1000000000000000000000000000000000000000000000000000"printSHA256 (packHex "0000000000000000000000000000000000000000000000000000000000000001")"0080000000000000000000000000000000000000000000000000"printSHA256 (packHex "7459ca5c6e117538122f04caf3dbfc58303028c26c58943430c16ff28a3b1d49")"0j8x7f5g4vy160s98n3cq8l30c2qzkdz7jh45w93hx8idrfclnbl"
valuepackHex :: String -> ByteString
#

Parse a hexadecimal hash representation into its binary form suitable for encoding with printSHA256.

Example1 expression
packHex "48656c6c6f2c20776f726c642e""Hello, world."

Leading zeros can be omitted, i.e. it's unnecessary to pad the input to an even number of bytes:

Example1 expression
packHex "0""\NUL"