diff --git a/Lastik.cabal b/Lastik.cabal
--- a/Lastik.cabal
+++ b/Lastik.cabal
@@ -1,8 +1,8 @@
 Name:               Lastik
-Version:            0.1
+Version:            0.2
 License:            BSD3
 License-File:       LICENSE
-Author:             Tony Morris <tmorris@tmorris.net>
+Author:             Tony Morris <code@tmorris.net>
 Maintainer:         Tony Morris
 Synopsis:           A library for compiling programs in a variety of languages
 Category:           Development
@@ -16,9 +16,9 @@
 
 Library
   if flag(small_base)
-    Build-Depends: base < 4 && >= 3, bytestring, directory, filepath, process, FileManip, zip-archive
+    Build-Depends: base < 4 && >= 3, bytestring, directory, filepath, process, FileManip, zip-archive, pureMD5, SHA
   else
-    Build-Depends: base < 3, filepath, process, FileManip, zip-archive
+    Build-Depends: base < 3, filepath, process, FileManip, zip-archive, pureMD5, SHA
 
   GHC-Options:    -Wall
   Exposed-Modules:
diff --git a/Lastik/Directory.hs b/Lastik/Directory.hs
--- a/Lastik/Directory.hs
+++ b/Lastik/Directory.hs
@@ -3,6 +3,7 @@
                         chdir,
                         archiveDirectories,
                         writeArchive,
+                        writeHashArchive,
                         copyDir,
                         dropRoot,
                         dropRoot',
@@ -17,6 +18,8 @@
 import qualified Data.ByteString.Lazy as B
 import Control.Monad
 import Control.Exception
+import Data.Digest.Pure.MD5
+import Data.Digest.Pure.SHA
 
 -- | Change to the given directory, then execute the given action, then change back to the original directory.
 chdir :: FilePath -- ^ The directory to change to.
@@ -25,7 +28,7 @@
 chdir d a = bracket getCurrentDirectory setCurrentDirectory (\_ -> setCurrentDirectory d >> a)
 
 -- | Create a zip archive by changing into directories and archiving the contents.
-archiveDirectories :: [(FilePath, FilePath)] -- ^ A list of base directory to change to and contents of that directory to archive.
+archiveDirectories :: [(FilePath, FilePath)] -- ^ A list of base directories to change to and contents of that directory to archive.
                       -> RecursionPredicate  -- ^ The recursion predicate to search for files to archive.
                       -> FilterPredicate     -- ^ The filter predicate to search for files to archive.
                       -> [ZipOption]         -- ^ The options during the creation of the archive.
@@ -34,7 +37,7 @@
                                                                       addFilesToArchive opts a j) emptyArchive dirs
 
 -- | Writes a zip archive to a file.
-writeArchive :: [(FilePath, FilePath)] -- ^ A list of base directory to change to and contents of that directory to archive.
+writeArchive :: [(FilePath, FilePath)] -- ^ A list of base directories to change to and contents of that directory to archive.
                 -> RecursionPredicate  -- ^ The recursion predicate to search for files to archive.
                 -> FilterPredicate     -- ^ The filter predicate to search for files to archive.
                 -> [ZipOption]         -- ^ The options during the creation of the archive.
@@ -42,6 +45,19 @@
                 -> IO ()
 writeArchive dirs rp fp opts f = do a <- archiveDirectories dirs rp fp opts
                                     B.writeFile f (fromArchive a)
+
+-- | Writes a zip archive to a file then computes a MD5 and SHA1 hash and writes them to files with @".MD5"@ and @".SHA"@ extensions.
+writeHashArchive :: [(FilePath, FilePath)] -- ^ A list of base directories to change to and contents of that directory to archive.
+                    -> RecursionPredicate  -- ^ The recursion predicate to search for files to archive.
+                    -> FilterPredicate     -- ^ The filter predicate to search for files to archive.
+                    -> [ZipOption]         -- ^ The options during the creation of the archive.
+                    -> FilePath            -- ^ The file to write the archive to and the prefix name of the files containing the hashes.
+                    -> IO ()
+writeHashArchive dirs rp fp opts f = do a <- archiveDirectories dirs rp fp opts
+                                        let s = fromArchive a
+                                        B.writeFile f s
+                                        writeFile (f <.> "MD5") (show (md5 s))
+                                        writeFile (f <.> "SHA") (show (sha1 s))
 
 -- | Copy the contents of a directory to another, perhaps trimming parent directories.
 copyDir :: RecursionPredicate -- ^ The recursion predicate to search for files in the source directory.
