652 Stimmen

Vergleich von zwei Byte-Arrays in .NET

Wie kann ich das schnell machen?

Sicher kann ich das tun:

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;
}

Aber ich suche entweder einen BCL Funktion oder eine andere hoch optimierte und bewährte Methode, dies zu tun.

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

funktioniert gut, aber es sieht nicht so aus, als würde das für x64 funktionieren.

Beachten Sie meine superschnelle Antwort ici .

-2voto

Wenn Sie einen sehr schnellen Byte-Array-Gleichheitsvergleicher suchen, empfehle ich Ihnen einen Blick auf diesen Artikel von STSdb Labs zu werfen: Byte-Array-Gleichheitsvergleicher. Es bietet einige der schnellsten Implementierungen für Byte[]-Array-Gleichheitsvergleiche, die vorgestellt, auf ihre Leistung getestet und zusammengefasst werden.

Sie können sich auch auf diese Umsetzungen konzentrieren:

BigEndianByteArrayComparer - schneller byte[]-Array-Vergleicher von links nach rechts (BigEndian) BigEndianByteArrayEqualityComparer - schneller byte[]-Gleichheitsvergleicher von links nach rechts (BigEndian) LittleEndianByteArrayComparer - schneller byte[] Array-Vergleicher von rechts nach links (LittleEndian) LittleEndianByteArrayEqualityComparer - schneller byte[]-Gleichheitskomparator von rechts nach links (LittleEndian)

-3voto

Da viele der obigen ausgefallenen Lösungen nicht mit UWP funktionieren und ich Linq und funktionale Ansätze liebe, möchte ich Ihnen meine Version dieses Problems vorstellen. Um den Vergleich zu umgehen, wenn der erste Unterschied auftritt, habe ich .FirstOrDefault() gewählt

public static bool CompareByteArrays(byte[] ba0, byte[] ba1) =>
    !(ba0.Length != ba1.Length || Enumerable.Range(1,ba0.Length)
        .FirstOrDefault(n => ba0[n] != ba1[n]) > 0);

-3voto

Alon Punkte 355

Die kurze Antwort lautet wie folgt:

    public bool Compare(byte[] b1, byte[] b2)
    {
        return Encoding.ASCII.GetString(b1) == Encoding.ASCII.GetString(b2);
    }

Auf diese Weise können Sie den optimierten .NET-Stringvergleich verwenden, um einen Byte-Array-Vergleich durchzuführen, ohne unsicheren Code schreiben zu müssen. So wird es in der Hintergrund :

private unsafe static bool EqualsHelper(String strA, String strB)
{
    Contract.Requires(strA != null);
    Contract.Requires(strB != null);
    Contract.Requires(strA.Length == strB.Length);

    int length = strA.Length;

    fixed (char* ap = &strA.m_firstChar) fixed (char* bp = &strB.m_firstChar)
    {
        char* a = ap;
        char* b = bp;

        // Unroll the loop

        #if AMD64
            // For the AMD64 bit platform we unroll by 12 and
            // check three qwords at a time. This is less code
            // than the 32 bit case and is shorter
            // pathlength.

            while (length >= 12)
            {
                if (*(long*)a     != *(long*)b)     return false;
                if (*(long*)(a+4) != *(long*)(b+4)) return false;
                if (*(long*)(a+8) != *(long*)(b+8)) return false;
                a += 12; b += 12; length -= 12;
            }
       #else
           while (length >= 10)
           {
               if (*(int*)a != *(int*)b) return false;
               if (*(int*)(a+2) != *(int*)(b+2)) return false;
               if (*(int*)(a+4) != *(int*)(b+4)) return false;
               if (*(int*)(a+6) != *(int*)(b+6)) return false;
               if (*(int*)(a+8) != *(int*)(b+8)) return false;
               a += 10; b += 10; length -= 10;
           }
       #endif

        // This depends on the fact that the String objects are
        // always zero terminated and that the terminating zero is not included
        // in the length. For odd string sizes, the last compare will include
        // the zero terminator.
        while (length > 0)
        {
            if (*(int*)a != *(int*)b) break;
            a += 2; b += 2; length -= 2;
        }

        return (length <= 0);
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X