.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 );

我使用過這個,我看到了巨大的性能影響。

相關文章
相關標籤/搜索