[Haskell] cantidad de entropía en un archivo
Estos días un usuario ha estado posteando código haskell en HackXCrack, lo que renovó el poco interés que tenía en dicho lenguaje ( muy recomendable Learn_You_a_Haskell_for_Greater_Good! para empezar, btw ), así que aquí está un ejemplo, muestra la cantidad de entropía en un archivo, de 0 a 8 [ entropy.hs ] . El plugin para mostrar código no tira de haskell, así que está coloreado con pyments dentro del post... ===============================================================================
!/usr/bin/runhaskell
-- Written by kenkeiras under the WTFPLv2
-- Para getArgs() import System.Environment
-- Para ord() import Data.Char
-- Cuenta las ocurrencias de cada tipo de caracteres countChars s = [ sum[ if ord(c) == code then 1 else 0|c<-s] | code <- [0 .. 255]]
-- Calcula la entropía a través del número de ocurrencias y el número total entropy arr l = sum[ if n /= 0 then (n / l) * logBase 2 (l / n) else 0 | n <- arr ]
showEntropy fname = do f <- readFile fname -- Lee el contenido del archivo
let l = length f -- determina el tamaño del archivo let lf = fromIntegral l -- convierte la longitud a Float ( necesario para el logaritmo )
let h = fname ++ "[" ++ show(l) ++ " bytes]: " putStr h
let count = countChars f -- Prepara el mapa de caracteres let e = entropy count lf -- Calcula la entropía let h = show(e)
putStrLn h
-- Comprueba los argumentos
main = do
args <- getArgs
let l = length args
if l /= 1
then error "./entropy.hs