.NET中的两个字节数组比较

我该如何快速完成? html

固然,我能够这样作: java

static bool ByteArrayCompare(byte[] a1, byte[] a2)
{
    if (a1.Length != a2.Length)
        return false;

    for (int i=0; i<a1.Length; i++)
        if (a1[i]!=a2[i])
            return false;

    return true;
}

可是我正在寻找BCL功能或一些通过高度优化的行之有效的方法。 数组

java.util.Arrays.equals((sbyte[])(Array)a1, (sbyte[])(Array)a2);

效果很好,但看起来不适用于x64。 安全

在这里记下个人超快速回答。 性能


#1楼

我想到了许多图形卡内置的块传输加速方法。 可是随后您将不得不按字节复制全部数据,所以若是您不想以不受管且与硬件相关的代码来实现逻辑的整个部分,那么这将无济于事。 测试

与上面显示的方法相似的另外一种优化方法是,从一开始就将尽量多的数据存储在long []中,而不是byte []中,例如,若是您从二进制文件中顺序读取数据,或者,若是您使用内存映射文件,则将数据读取为long []或单个long值。 而后,您的比较循环将只须要对包含相同数据量的byte []执行的迭代次数的1/8。 您须要什么时候以及多长时间比较一次,以及什么时候以及多长时间须要按字节访问数据的问题,例如,在API调用中将其用做指望的方法中的参数一个字节[]。 最后,您只能告诉您是否真的知道用例... 优化


#2楼

若是查看.NET如何处理string.Equals,您会发现它使用了一个称为EqualsHelper的私有方法,该方法具备“不安全”的指针实现。 .NET Reflector是您的朋友,能够了解内部的工做方式。 spa

这能够用做字节数组比较的模板,我在博客文章C#中的快速字节数组比较中进行了实现。 我还作了一些基本的基准测试,以了解安全实施的时间快于不安全实施的时间。 指针

也就是说,除非您真的须要杀手级的性能,不然我将进行简单的fr循环比较。 code


#3楼

为了比较短字节数组,如下是一个有趣的技巧:

if(myByteArray1.Length != myByteArray2.Length) return false;
if(myByteArray1.Length == 8)
   return BitConverter.ToInt64(myByteArray1, 0) == BitConverter.ToInt64(myByteArray2, 0); 
else if(myByteArray.Length == 4)
   return BitConverter.ToInt32(myByteArray2, 0) == BitConverter.ToInt32(myByteArray2, 0);

而后,我可能会遇到问题中列出的解决方案。

对该代码进行性能分析将颇有趣。


#4楼

P /调用电源激活!

[DllImport("msvcrt.dll", CallingConvention=CallingConvention.Cdecl)]
static extern int memcmp(byte[] b1, byte[] b2, long count);

static bool ByteArrayCompare(byte[] b1, byte[] b2)
{
    // Validate buffers are the same length.
    // This also ensures that the count does not exceed the length of either buffer.  
    return b1.Length == b2.Length && memcmp(b1, b2, b1.Length) == 0;
}

#5楼

若是您有一个巨大的字节数组,您能够经过将它们转换为字符串来比较它们。

你可使用相似的东西

byte[] b1 = // Your array
byte[] b2 = // Your array
string s1 = Encoding.Default.GetString( b1 );
string s2 = Encoding.Default.GetString( b2 );

我使用过这个,我看到了巨大的性能影响。

相关文章
相关标签/搜索