Uli Köhler
Uli Köhler

Reputation: 13750

Compute MD5 digest of file in Haskell

Using Haskell, how can I compute the MD5 digest of a file without using external tools like md5sum?

Upvotes: 10

Views: 2961

Answers (3)

Atemu
Atemu

Reputation: 406

You should be using cryptonite nowadays:

import System.Environment
import Crypto.Hash
import qualified Data.ByteString.Lazy as L

main = do
  content <- L.readFile "foo.txt"

  let digest = hashlazy content :: Digest MD5

  putStrLn $ show digest

(You can actually replace MD5 with any hash algorithm cryptonite supports, SHA256 for instance.)

Upvotes: 3

Uli K&#246;hler
Uli K&#246;hler

Reputation: 13750

Another option would be using cryptohash which is based on a C implementation and also provides other hashes algorithms like SHA1:

import qualified Data.ByteString.Lazy as LB
import Crypto.Hash

md5 :: LB.ByteString -> Digest MD5
md5 = hashlazy

main :: IO ()
main = do
    fileContent <- LB.readFile "foo.txt"
    let md5Digest = md5 fileContent
    print $ digestToHexByteString md5Digest

Upvotes: 2

Uli K&#246;hler
Uli K&#246;hler

Reputation: 13750

One option is to use the pureMD5 package, for example if you want to compute the hash of the file foo.txt:

import qualified Data.ByteString.Lazy as LB
import Data.Digest.Pure.MD5

main :: IO ()
main = do
    fileContent <- LB.readFile "foo.txt"
    let md5Digest = md5 fileContent
    print md5Digest

This code prints the the same MD5 sum as md5sum foo.txt.

If you prefer a one-liner, you can use this one (the imports are the same as above):

LB.readFile "foo.txt" >>= print . md5

Upvotes: 7

Related Questions