Parallel brute force: Difference between revisions

m
Line 792:
1115dd800feaacefdf481f1f9070374a2a81e27880f187396db67958b207cbad -> zyzzx
</pre>
Or using worker threads with buffered read/write channels
<lang haskell>import Control.Concurrent (forkIO, writeList2Chan, setNumCapabilities)
import Control.Concurrent.Chan (newChan, readChan, Chan)
import Control.Monad (replicateM, forever, replicateM_)
import Crypto.Hash (hashWith, SHA256(..), Digest)
import Data.Bifunctor (first)
import Data.ByteString (pack)
import Data.Char (isDigit)
import Data.List.Split (chunksOf)
import Data.Word (Word8)
import System.Environment (getArgs)
import Text.Printf (printf)
 
type Decrypted = String
type Encrypted = Digest SHA256
type TestString = [Word8]
 
hashedValues :: [Encrypted]
hashedValues = read <$>
[ "3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b"
, "74e1bb62f8dabb8125a58852b63bdf6eaef667cb56ac7f7cdba6d7305c50a22f"
, "1115dd800feaacefdf481f1f9070374a2a81e27880f187396db67958b207cbad" ]
 
chunks :: [[TestString]]
chunks = chunksOf (10^6) $ replicateM 5 [97..122]
 
findMatch :: [TestString] -> [(Encrypted, Decrypted)]
findMatch [] = []
findMatch (x:xs)
| hashed `elem` hashedValues = (hashed, show bStr):findMatch xs
| otherwise = findMatch xs
where
bStr = pack x
hashed = hashWith SHA256 bStr
 
searchWorker :: Chan [TestString] -> Chan (Encrypted, String) -> IO ()
searchWorker batchChan resultChan = forever (readChan batchChan >>= writeList2Chan resultChan . findMatch)
parseInput :: [String] -> Int
parseInput [] = 2
parseInput (s:xs) = if all isDigit s then read s else 2
 
main :: IO ()
main = do
workers <- getArgs
let wCount = parseInput workers
setNumCapabilities wCount
printf "Using %d workers\n" wCount
resultChan <- newChan
batchChan <- newChan
replicateM_ wCount (forkIO $ searchWorker batchChan resultChan)
writeList2Chan batchChan chunks
replicateM_ (length hashedValues) (readChan resultChan >>= uncurry (printf "%s -> %s\n") . first show)</lang>
{{out}}
<pre>brute 2
Using 2 workers
3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b -> "apple"
74e1bb62f8dabb8125a58852b63bdf6eaef667cb56ac7f7cdba6d7305c50a22f -> "mmmmm"
1115dd800feaacefdf481f1f9070374a2a81e27880f187396db67958b207cbad -> "zyzzx"</pre>
 
=={{header|Java}}==
Anonymous user