Я все еще работаю над своей реализацией 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 все равно сделает это за меня.
Может ли кто-нибудь увидеть значительную оптимизацию, которую можно применить в дальнейшем?
К вашему сведению, вызовы 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