.NET框架方法中的按位和运算符

Leg*_*nds 0 .net c# c#-4.0

我在.NET框架类中找到了这个方法,它使用Bitwise & 运算符来比较字节数组:

我认为这个功能不是最佳的.例如,我们有两个字符串:

  1. 生活
  2. 生活

比较两个字符串时,第三个字符是不同的.因此,当将两者都转换为字节数组时,第三个字节将不同,因此布尔变量标志将为false,并且在方法完成之前将为false.

我会把这一行放在后面:

flag = flag & a[i] == b[i];
if(flag==false)return false;
Run Code Online (Sandbox Code Playgroud)

为了防止进一步的循环执行.那么为什么这个实现就是现在呢?

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

在此输入图像描述

保存实现的类驻留在System.Web.WebPages.dll,Version = 3.0.0.0,Namespace System.Web.Helpers中:

using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;

namespace System.Web.Helpers
{
internal static class CryptoUtil
{
public static bool AreByteArraysEqual(byte[] a, byte[] b)
{
    if (a == null || b == null || (int)a.Length != (int)b.Length)
    {
        return false;
    }
    bool flag = true;
    for (int i = 0; i < (int)a.Length; i++)
    {
        flag = flag & a[i] == b[i];
    }
    return flag;
}

public static byte[] ComputeSHA256(IList<string> parameters)
{
    byte[] numArray;
    using (MemoryStream memoryStream = new MemoryStream())
    {
        using (BinaryWriter binaryWriter = new BinaryWriter(memoryStream))
        {
            foreach (string parameter in parameters)
            {
                binaryWriter.Write(parameter);
            }
            binaryWriter.Flush();
            using (SHA256Cng sHA256Cng = new SHA256Cng())
            {
                byte[] numArray1 = sHA256Cng.ComputeHash(memoryStream.GetBuffer(), 0, checked((int)memoryStream.Length));
                numArray = numArray1;
            }
        }
    }
    return numArray;
}
}
}
Run Code Online (Sandbox Code Playgroud)

小智 7

您的代码看起来像反编译器的输出.当实际源代码可用时,不要查看反编译器的输出.它可能有相关的评论,并在这里:

// This method is specially written to take the same amount of time
// regardless of where 'a' and 'b' differ. Please do not optimize it.
public static bool AreByteArraysEqual(byte[] a, byte[] b)
...
Run Code Online (Sandbox Code Playgroud)

您所做的改进意味着评估AreByteArraysEqual相等长度的两个字节数组所需的时间取决于初始字节的匹配数量.通常这不是问题.对于这种方法,它是,因为它将允许调用者获取数据(通过不断尝试直到第一个字节是正确的,然后继续尝试直到第二个字节是正确的,依此类推)这意味着保持秘密.