Gói cryptohash có thể là đơn giản nhất để sử dụng. Chỉ cần đọc đầu vào của bạn vào một số ByteString lười và sử dụng hàm hashlazy
để nhận ByteString với băm kết quả. Đây là một chương trình mẫu nhỏ mà bạn có thể sử dụng để so sánh đầu ra với giá trị của sha1sum
.
import Crypto.Hash.SHA1 (hashlazy)
import qualified Data.ByteString as Strict
import qualified Data.ByteString.Lazy as Lazy
import System.Process (system)
import Text.Printf (printf)
hashFile :: FilePath -> IO Strict.ByteString
hashFile = fmap hashlazy . Lazy.readFile
toHex :: Strict.ByteString -> String
toHex bytes = Strict.unpack bytes >>= printf "%02x"
test :: FilePath -> IO()
test path = do
hashFile path >>= putStrLn . toHex
system $ "sha1sum " ++ path
return()
Vì đây đọc byte đơn giản, không ký tự, không nên có vấn đề mã hóa và nó sẽ luôn luôn cung cấp cho các kết quả tương tự như sha1sum
:
> test "/usr/share/dict/words"
d6e483cb67d6de3b8cfe8f4952eb55453bb99116
d6e483cb67d6de3b8cfe8f4952eb55453bb99116 /usr/share/dict/words
này cũng làm việc cho bất kỳ băm được hỗ trợ bởi gói cryptohash. Chỉ cần thay đổi quá trình nhập, ví dụ: Crypto.Hash.SHA256
để sử dụng hàm băm khác.
Sử dụng chế độ lười ByteStrings tránh tải toàn bộ tệp vào bộ nhớ cùng một lúc, điều quan trọng khi làm việc với tệp lớn.
Tôi không thể đánh giá chất lượng của việc triển khai, nhưng có một số triển khai SHA1 trong các gói về tấn công (phần mã hóa). Theo định nghĩa của SHA1, nó hoạt động trên các byte của tập tin, do đó, cho dù đó là văn bản hoặc nhị phân không quan trọng, và tất cả các triển khai chính xác cho kết quả tương tự cho cùng một tập tin. –