Sie können unsicheren Code verwenden, um Zeigeroperationen auszuführen. Sie können die Bytes vier zu einem Zeitpunkt, als ganze Zahlen vergleichen:
public static bool ArrayCompare(byte[] a, byte[] b) {
if (a.Length != b.Length) return false;
int len = a.Length;
unsafe {
fixed(byte* ap = a, bp = b) {
int* aip = (int*)ap, bip = (int*)bp;
for (;len >= 4;len-=4) {
if (*aip != *bip) return false;
aip++;
bip++;
}
byte* ap2 = (byte*)aip, bp2 = (byte*)bip;
for (;len>0;len--) {
if (*ap2 != *bp2) return false;
ap2++;
bp2++;
}
}
}
return true;
}
A diese gegen eine einfache Schleife getestet, und es ist etwa sechsmal schneller.
Wie von Josh Einstein vorgeschlagen, könnte lange auf einem 64-Bit-System verwendet werden. Eigentlich scheint es fast doppelt so schnell sowohl auf 32- und 64-Bit-Systeme zu sein:
public static bool ArrayCompare64(byte[] a, byte[] b) {
if (a.Length != b.Length) return false;
int len = a.Length;
unsafe {
fixed (byte* ap = a, bp = b) {
long* alp = (long*)ap, blp = (long*)bp;
for (; len >= 8; len -= 8) {
if (*alp != *blp) return false;
alp++;
blp++;
}
byte* ap2 = (byte*)alp, bp2 = (byte*)blp;
for (; len > 0; len--) {
if (*ap2 != *bp2) return false;
ap2++;
bp2++;
}
}
}
return true;
}
Müssen Sie nur zwei Blöcke oder einen Block mit mehreren vergleichen? Vielleicht, wenn Sie uns mehr über das Szenario erzählen, in dem Sie dies tun, könnten noch bessere Lösungen gefunden werden? Zum Beispiel, wenn Sie eine Sequenz von Blöcken mit vielen anderen Blöcken vergleichen müssen, würde ein einfacher Hash Ihnen zumindest viele garantierte Unterschiede mit minimaler Arbeit geben, und dann könnten Sie sich auf die potentiell falschen Positive konzentrieren. –