#!/usr/bin/env stack -- stack --resolver lts-11.10 script {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE NoImplicitPrelude #-} import qualified Data.ByteString.Char8 as B import Data.Hashable (hash) import qualified Data.Text as T import Data.Text.Encoding import qualified Data.Text.IO as T import RIO import System.Environment (getArgs) import System.Exit (die) main :: IO () main = do args <- getArgs arg <- case args of [] -> die "Supply the file with colliding strings as an argument" (a : _) -> pure a bs <- B.readFile arg let ls = filter (not . B.null) $ B.lines bs texts' <- fmap catMaybes $ forM ls $ \l' -> do let l = if even (B.length l') then l' else l' <> "\0" res <- tryAnyDeep $ return $ decodeUtf16LE (l :: B.ByteString) case res of Left e -> error $ show (l, e) Right x -> return $ Just x T.putStr $ T.unlines $ flip map texts' $ \t -> T.unwords [T.pack (show t), "hashes to", T.pack (show (hash t))]