Все еще работает над моей реализацией SHA1 в Haskell. Теперь у меня есть рабочая реализация, и это внутренний цикл:
iterateBlock' :: Int -> [Word32] -> Word32 -> Word32 -> Word32 -> Word32 -> Word32 -> [Word32]
iterateBlock' 80 ws a b c d e = [a, b, c, d, e]
iterateBlock' t (w:ws) a b c d e = iterateBlock' (t+1) ws a' b' c' d' e'
where
a' = rotate a 5 + f t b c d + e + w + k t
b' = a
c' = rotate b 30
d' = c
e' = d
Профилировщик сообщает мне, что эта функция занимает 1/3 от времени выполнения моей реализации. Я не могу думать о том, чтобы не оптимизировать его, кроме как, возможно, встраивать временные переменные, но я верю, что -O2 сделает это для меня в любом случае.
Может ли кто-нибудь увидеть существенную оптимизацию, которая может быть дополнительно применена?
FYI: k и f - ниже. Они такие простые, что я не думаю, что есть способ оптимизировать эти другие. Если модуль Data.Bits не работает?
f :: Int -> Word32 -> Word32 -> Word32 -> Word32
f t b c d
| t <= 19 = (b .&. c) .|. ((complement b) .&. d)
| t <= 39 = b `xor` c `xor` d
| t <= 59 = (b .&. c) .|. (b .&. d) .|. (c .&. d)
| otherwise = b `xor` c `xor` d
k :: Int -> Word32
k t
| t <= 19 = 0x5A827999
| t <= 39 = 0x6ED9EBA1
| t <= 59 = 0x8F1BBCDC
| otherwise = 0xCA62C1D6