Hi. I removed my own “byte array equivalence” code recently when I noticed ServiceStack already had code to do what I need.
That said, I discovered there seems to be two methods checking byte array equivalence, one seems to shortcut on difference (which would be “better/faster” I guess), except the other uses aggressive inlining (suggesting to me that it is a high performance situation and so would benefit from early exit logic.
I have pasted both ServiceStack methods below, as far as I can see they ultimately achieve the same thing but am unsure if this is
a) an intentional copy given the slightly different logic and inlining or
b) some low hanging fruit that could be tided/unified.
public static bool AreEqual(this byte[] b1, byte[] b2)
{
if (b1 == b2) return true;
if (b1 == null || b2 == null) return false;
if (b1.Length != b2.Length) return false;
for (var i = 0; i < b1.Length; i++)
{
if (b1[i] != b2[i]) return false;
}
return true;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool EquivalentTo(this byte[] bytes, byte[] other)
{
if (bytes == null || other == null)
return bytes == other;
if (bytes.Length != other.Length)
return false;
var compare = 0;
for (var i = 0; i < other.Length; i++)
compare |= other[i] ^ bytes[i];
return compare == 0;
}