2012-11-30 123 views
4
W_t = M_t[i] if 0 <= t <= 15 
W_t = ROTL_1(W_(t-3) XOR W_(t-8) XOR W_(t-14) XOR W_(t-16)) if 16 <= t <= 79 

这是来自SHA-1标准。在haskell中你所要做的是写一个递归函数来做到这一点,但为了使它更有效率,我想展开整个递归。内联将不起作用,因为这可能导致代码的指数式爆炸。我想到的是写TH生成常量行W_0W_1W_2等等直到W_79循环和递归展开

另一个例子是用于循环展开的情况下

For t=0 to 79: 
{ 
    T = ROTL_5(a) + f_t(b, c, d) + e + K_t + W_t 
    e = d 
    d = c 
    c = ROTL_30(b) 
    b = a 
    a = T 
} 

我想展开这个循环,以及避免递归函数调用(我不认为GHC将要执行这种优化) 。

所以,在我去写这篇TH之前,我想问一下是否有更好的方法来做到这一点。只是说在这里优化是非常关键的。

回答