안전하지 않은 코드를 사용하여 포인터 작업을 수행 할 수 있습니다.
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는 간단한 루프에 대해이 테스트를하고, 약 6 배 빠른 속도입니다 : 당신은 정수로 한 번에 바이트 사를 비교할 수 있습니다.
조쉬 아인슈타인 (Josh Einstein)이 제안한대로 64 비트 시스템에서 long을 사용할 수 있습니다. 성능이 정말로 다음은 CRT 라이브러리는 윈도우의 모든 버전에 포함 된 사용하는 것입니다 할 수있는 가장 빠른 방법을 중요한 경우
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;
}
두 블록 만 비교하거나 한 블록을 여러 블록 비교해야합니까? 아마 당신이 시나리오에서 더 많은 것을 이야기한다면, 더 나은 해결책이 발견 될 것입니다. 예를 들어 블록 시퀀스를 다른 많은 블록과 비교해야 할 경우 간단한 해시는 최소한의 작업으로 많은 보장 된 차이점을 제공하고 잠재적 인 오탐에 집중할 수 있습니다. –