xuxinhang / cattle-temporary-posts

临时放放
0 stars 0 forks source link

密码学 Haskell 碎碎念 #4

Open xuxinhang opened 5 years ago

xuxinhang commented 5 years ago

关于“增加严格执行”

Haskell Real World 介绍了增加严格执行 的内容

这是 [Word8] 版本的逻辑

blockLoop :: [[Word8]] -> [Word8] -> [[Word8]]
blockLoop initial blocks
  | null blocks = initial
  | otherwise = blockLoop (blockStep m initial) ms
  where
    (m, ms) = splitAt 64 blocks
    blockStep = blockStepWithRound 79 -- 将一个 Block 处理 79 轮

照葫芦画瓢,得到 ByteString.Lazy 版本的:

blockLoopWithBS :: [ByteSequence] -> L.ByteString -> [ByteSequence]
blockLoopWithBS initial blocks
  | L.null blocks = initial
  | otherwise = blockLoopWithBS (blockStep (L.unpack m) initial) ms
  where
    (m, ms) = L.splitAt 64 blocks
    blockStep = blockStepWithRound 79 -- 将一个 Block 处理 79 轮

但是上面的版本在处理大文件的时候吃掉了很多很多的内存,两个G吧……

为什么

可能是 blockStep (L.unpack m) initial 惰性求值的问题,haskell 只记下来 thunk ,因为 ByteString 很长,所以 thunk 很大。但实际上,这一表达式计算出来的结果只有 5×32 个 bit 而已。