in Microsoft.Shared.Dna.Hash/AffineHash.cs [530:562]
private unsafe int GetHashCodeBigEndian(byte* valuePointer, int length)
{
ulong result = 0UL;
ulong block = 0U;
int remainder = length & 3; // mod 4
int cutoff = length - remainder;
int i = 0;
while (i < cutoff)
{
block =
((ulong)(*(valuePointer + i++)) << 24) |
((ulong)(*(valuePointer + i++)) << 16) |
((ulong)(*(valuePointer + i++)) << 8) |
((ulong)(*(valuePointer + i++)));
result = this.ComputeSmallBlock(result + block);
}
if (remainder == 0)
{
return (int)result;
}
byte* remainderPointer = valuePointer + cutoff;
int offset = 24;
block = 0UL;
for (i = 0; i < remainder; i++)
{
block |= (ulong)(*(remainderPointer + i)) << offset;
offset -= 8;
}
return (int)this.ComputeSmallBlock(result + block);
}