in Microsoft.Shared.Dna.Hash/AffineHash.cs [600:628]
private unsafe int GetHashCodeLittleEndian(byte* valuePointer, int length)
{
ulong result = 0UL;
ulong block = 0UL;
int blocks = length >> 2; // div 4
uint* blockPointer = (uint*)valuePointer;
for (int i = 0; i < blocks; i++)
{
block = *(blockPointer + i);
result = this.ComputeSmallBlock(result + block);
}
int remainder = length & 3; // mod 4
if (remainder == 0)
{
return (int)result;
}
byte* remainderPointer = valuePointer + length - remainder;
int offset = 0;
block = 0U;
for (int i = 0; i < remainder; i++)
{
block |= (ulong)(*(remainderPointer + i)) << offset;
offset += 8;
}
return (int)this.ComputeSmallBlock(result + block);
}