Distribution/Utils/Base62.hs

    -- | Implementation of base-62 encoding, which we use when computing hashes
    -- for fully instantiated unit ids.
    module Distribution.Utils.Base62 (hashToBase62) where

    import GHC.Fingerprint ( Fingerprint(..), fingerprintString )
    import Numeric ( showIntAtBase )
    import Data.Char ( chr )

    -- | Hash a string using GHC's fingerprinting algorithm (a 128-bit
    -- MD5 hash) and then encode the resulting hash in base 62.
    hashToBase62 :: String -> String
    hashToBase62 s = showFingerprint $ fingerprintString s
      where
        showIntAtBase62 x = showIntAtBase 62 representBase62 x ""
        representBase62 x
            | x < 10 = chr (48 + x)
            | x < 36 = chr (65 + x - 10)
            | x < 62 = chr (97 + x - 36)
            | otherwise = '@'
        showFingerprint (Fingerprint a b) = showIntAtBase62 a ++ showIntAtBase62 b