diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,10 @@
 # Revision history for crypto
 
-## 0.1.0.0 -- YYYY-mm-dd
+## 1.1.0 -- 2025-01-05
+
+* Added a hash function
+* Added documentation
+
+## 1.0.0 -- 2025-01-04
 
 * First version. Released on an unsuspecting world.
diff --git a/datacrypto.cabal b/datacrypto.cabal
--- a/datacrypto.cabal
+++ b/datacrypto.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               datacrypto
-version:            1.0.0
+version:            1.1.0
 license:            MIT
 author:             jb@doctorbirch.com
 build-type:         Simple
@@ -11,7 +11,9 @@
 synopsis:           Encryption library
 library
     default-extensions:
-        DerivingStrategies
+        BangPatterns,
+        DerivingStrategies,
+        Safe
     exposed-modules:  Data.Crypto
     build-depends:    base ^>=4.20.0.0
     hs-source-dirs:   src
diff --git a/src/Data/Crypto.hs b/src/Data/Crypto.hs
--- a/src/Data/Crypto.hs
+++ b/src/Data/Crypto.hs
@@ -1,14 +1,29 @@
-module Data.Crypto (generatekey, encrypt, decrypt) where
+{-|
+Module      : Data.Crypto
+Description : Encryption library
+Copyright   : (c) dr. Jonas Birch, 2025
+License     : MIT
+Maintainer  : none
+Stability   : stable
+Portability : portable
 
+Block cipher encryption library.
+-}
+
+module Data.Crypto (generatekey, encrypt, decrypt, hash) where
+
 import Prelude hiding (round)
 import Data.Word (Word8)
 import Data.Bits ((.&.))
 
+-- | Takes an integer value in the range [0..1023] and
+--  produces a ten bit encryption key.
 generatekey :: Word -> Key
 generatekey w
  | w `elem` [0..1023] = bin10 w
  | otherwise = bin10 (w `mod` 1024)
 
+-- | Encrypting an 8 bit value.
 encrypt :: Key -> Word8 -> Word8
 encrypt k w = let
     (sk1,sk2) = keyschedule k
@@ -18,6 +33,7 @@
  in
     dec ct
 
+-- | Decrypting an 8 bit value.
 decrypt :: Key -> Word8 -> Word8
 decrypt k w = let
     (sk1,sk2) = keyschedule k
@@ -27,6 +43,34 @@
  in
     dec pt
 
+constant :: Key
+constant = B10 One Zero Zero Zero One Zero Zero Zero One One
+
+-- | __hash__ /n val/
+--  
+--  Hashes an 8 bit value, using n number of rounds.
+hash :: Int -> Word8 -> Word8
+hash n w = let
+    subkeys   = keyschedule constant
+    ct        = bin w
+    preround  = (split . ip) ct
+ in
+    hash' n subkeys preround
+
+hash' :: Int -> (Subkey,Subkey) -> (Block,Block) -> Word8
+hash' 0 _ b = dec $ ipinverse b
+hash' !n (s1,s2) (b1,b2) = 
+    hash' (n - 1) (sk1,sk2) ((round s2 . sw. round s1)
+        (if even n then
+            (b1,b2)
+        else
+            (b2,b1))
+    )
+ where
+    sk1,sk2 :: Subkey
+    sk1 = ls1 s1
+    sk2 = ls1 s2
+
 keyschedule :: Key -> (Subkey,Subkey)
 keyschedule k = let
     key' :: Subkey
@@ -212,6 +256,8 @@
 ls1,ls2 :: Rotation
 ls1 (B5 k1 k2 k3 k4 k5) =
     B5 k2 k3 k4 k5 k1
+ls1 (B8 k1 k2 k3 k4 k5 k6 k7 k8) =
+    B8 k2 k3 k4 k5 k6 k7 k8 k1
 ls1 _ = undefined
 ls2 (B5 k1 k2 k3 k4 k5) =
     B5 k3 k4 k5 k1 k2
