Sen işaretçi işlemlerini yapmak güvensiz kodu kullanabilirsiniz.
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;
}
bir basit döngü karşı bu test, ve yaklaşık altı kat daha hızlı: Sen tamsayı olarak bir defada bayt dört karşılaştırabilirsiniz. Josh Einstein tarafından önerildiği gibi
, uzun bir 64 bit sistemde kullanılabilir. performans gerçekten o zaman CRT kütüphane Windows her yeni versiyonu ile birlikte kullanmaktır yapmak için en hızlı yol konularda ise
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;
}
birkaç karşı iki blok sadece, ya bir blok karşılaştırmak gerekir mi? Belki de bunu yaptığınız senaryo hakkında daha fazla şey anlatırsanız, daha iyi çözümler de bulunabilir mi? Örneğin, bir çok bloğu diğer birçok bloğa karşı karşılaştırmanız gerekirse, basit bir karma, en azından minimum çalışma ile çok fazla garantili farklılıklar sağlar ve sonra potansiyel olarak yanlış pozitiflere odaklanabilirsiniz. –