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_1等等W_2W_79

另一个例子是for循环展开的情况

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 之前,我想问一下是否有更好的方法来做这件事。只是说优化在这里非常关键。

4

1 回答 1

2

TH 是执行用户控制的循环展开的“标准”方式。

于 2012-11-30T13:03:37.837 回答