MethodImpl(NoOptimization)对这个方法有什么作用?这真的很麻烦吗?

Nef*_*ion 10 c# optimization cil

好吧,我想哈希一个密码,我看看ASP.net Identity在Microsoft.AspNet.Identity.CryptoClass 中是怎么做的,我来了这个函数(用于比较2个密码Hashes):

[MethodImpl(MethodImplOptions.NoOptimization)]
private static bool ByteArraysEqual(byte[] a, byte[] b)
{
    if (object.ReferenceEquals(a, b))
    {
        return true;
    }
    if (((a == null) || (b == null)) || (a.Length != b.Length))
    {
        return false;
    }
    bool flag = true;
    for (int i = 0; i < a.Length; i++)
    {
        flag &= a[i] == b[i];
    }
    return flag;
}
Run Code Online (Sandbox Code Playgroud)

这是反射器输出的直接复制......

现在我的问题是,NoOptimization属性的优点什么,为什么它应该存在(如果我删除它会发生什么)?对我来说,它看起来像是一个默认的Equals()实现,直到for-loop.

我试着看一下IL,但这对我来说都是胡说八道:/

tmy*_*ebu 17

如果"智能"编译器将该函数转换false为在发现不匹配时立即返回的内容,则可能使使用此函数的代码容易受到"定时攻击" - 攻击者可以想象出第一个不匹配的位置string取决于函数返回的时间.

实际上,这不仅仅是科幻小说,即使它看起来像是这样.即使有了互联网,你也可以采取一大堆样本并使用一些统计数据来弄清楚如果你猜测实现是否会短路会发生什么.