我该如何快速完成?
当然,我可以这样做:
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。
在这里记下我的超快速回答。
gil 用户建议使用不安全的代码,从而产生了此解决方案:
// Copyright (c) 2008-2013 Hafthor Stefansson // Distributed under the MIT/X11 software license // Ref: http://www.opensource.org/licenses/mit-license.php. static unsafe bool UnsafeCompare(byte[] a1, byte[] a2) { if(a1==a2) return true; if(a1==null || a2==null || a1.Length!=a2.Length) return false; fixed (byte* p1=a1, p2=a2) { byte* x1=p1, x2=p2; int l = a1.Length; for (int i=0; i < l/8; i++, x1+=8, x2+=8) if (*((long*)x1) != *((long*)x2)) return false; if ((l & 4)!=0) { if (*((int*)x1)!=*((int*)x2)) return false; x1+=4; x2+=4; } if ((l & 2)!=0) { if (*((short*)x1)!=*((short*)x2)) return false; x1+=2; x2+=2; } if ((l & 1)!=0) if (*((byte*)x1) != *((byte*)x2)) return false; return true; } }
它将对尽可能多的数组进行基于64位的比较。这种依靠数组以qword开头的事实。如果没有qword对齐,它将可以工作,只是速度不如它快。
它比简单for循环执行大约七个计时器。使用J#库等效于原始for循环执行。使用.SequenceEqual大约慢7倍;我认为只是因为它正在使用IEnumerator.MoveNext。我想象基于LINQ的解决方案至少要这么慢或更糟。
for