我在.NET框架类中找到了这个方法,它使用Bitwise &
运算符来比较字节数组:
我认为这个功能不是最佳的.例如,我们有两个字符串:
比较两个字符串时,第三个字符是不同的.因此,当将两者都转换为字节数组时,第三个字节将不同,因此布尔变量标志将为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相等长度的两个字节数组所需的时间取决于初始字节的匹配数量.通常这不是问题.对于这种方法,它是,因为它将允许调用者获取数据(通过不断尝试直到第一个字节是正确的,然后继续尝试直到第二个字节是正确的,依此类推)这意味着保持秘密.