Created
March 6, 2017 14:45
-
-
Save idontgetoutmuch/2a50f555c203a8d8914a8305bebf7df7 to your computer and use it in GitHub Desktop.
A simple-ish example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| module CRC32 (crc32_tab, crc32, crc32String) where | |
| import Data.Bits | |
| import Data.Word | |
| import Data.Char | |
| -- table and sample code derived from | |
| -- http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/libkern/crc32.c | |
| -- * COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or | |
| -- * code or tables extracted from it, as desired without restriction. | |
| crc32_tab :: [Word32] | |
| crc32_tab = [ | |
| 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, | |
| 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, | |
| 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, | |
| 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, | |
| 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, | |
| 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, | |
| 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, | |
| 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, | |
| 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, | |
| 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, | |
| 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, | |
| 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, | |
| 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, | |
| 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, | |
| 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, | |
| 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, | |
| 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, | |
| 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, | |
| 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, | |
| 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, | |
| 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, | |
| 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, | |
| 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, | |
| 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, | |
| 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, | |
| 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, | |
| 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, | |
| 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, | |
| 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, | |
| 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, | |
| 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, | |
| 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, | |
| 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, | |
| 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, | |
| 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, | |
| 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, | |
| 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, | |
| 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, | |
| 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, | |
| 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, | |
| 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, | |
| 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, | |
| 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d | |
| ] | |
| crc32 :: [Word8] -> Word32 | |
| crc32 msg = go 0xffffffff msg | |
| where go crc [] = crc | |
| go crc (w:ws) = go crc' ws | |
| where crc' = (crc `shiftR` 8) `xor` | |
| (crc32_tab !! fI (fI crc `xor` w)) | |
| fI x = fromIntegral x | |
| crc32String :: String -> Word32 | |
| crc32String = crc32 . map (fromIntegral . ord) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import Data.Word | |
| import Data.Bits | |
| import Data.Char | |
| import Debug.Trace | |
| import Data.Array.Accelerate hiding (fromIntegral, shiftR, map, zipWith, unzip, replicate, length, maximum, ord, (!!)) | |
| import qualified Data.Array.Accelerate as A | |
| import qualified Data.Array.Accelerate.Data.Bits as B | |
| import Data.Array.Accelerate.Interpreter | |
| import CRC32 | |
| crc32_one :: Acc (Vector Word32) -> Exp Word32 -> Exp Word8 -> Exp Word32 | |
| crc32_one tab crc char | |
| = (char A.== 0) ? | |
| ( crc | |
| , (tab ! index1 (A.fromIntegral (A.fromIntegral crc `B.xor` char))) | |
| `B.xor` | |
| crc `B.shiftR` 8 | |
| ) | |
| crcAll :: [String] -> Acc (Vector Word32) | |
| crcAll words = all width init_crcs words | |
| where | |
| n = length words | |
| width = maximum (0 : map length words) | |
| table :: Acc (Vector Word32) | |
| table = use (fromList (Z:.256) crc32_tab) | |
| init_crcs :: Acc (Vector Word32) | |
| init_crcs = fill (index1 (constant n)) (constant 0xffffffff) | |
| myHead :: String -> (Word8, String) | |
| myHead [] = (0, []) | |
| myHead (c:cs) = (fromIntegral (ord c), cs) | |
| one_iter :: Acc (Vector Word32) -> Acc (Vector Word8) | |
| -> Acc (Vector Word32) | |
| one_iter crcs chars = A.zipWith (crc32_one table) crcs chars | |
| all :: Int -> Acc (Vector Word32) -> [String] -> Acc (Vector Word32) | |
| all 0 crcs _ = crcs | |
| all x crcs words = all (x-1) (one_iter crcs chars) tails | |
| where | |
| chars = use (fromList (Z:.n) heads) | |
| (heads, tails) = unzip (map myHead words) | |
| find :: Acc (Vector Word32) -> Acc (Scalar Int) | |
| find arr = A.fold A.max (constant 0) (A.zipWith check arr ixs) | |
| where check :: Exp Word32 -> Exp Int -> Exp Int | |
| check x ix = x A.== password_hash ? ( ix, 0 ) | |
| ixs = generate (shape arr) unindex1 | |
| password_hash = constant 0x18f8add4 :: Exp Word32 | |
| main = do | |
| s <- readFile "/usr/share/dict/words" | |
| let ls = lines s | |
| let [r] = toList $ run $ find $ crcAll ls | |
| print (ls !! r) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment