Skip to content

Instantly share code, notes, and snippets.

@israellot
Last active September 26, 2022 20:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save israellot/a06f244ca53d06c5244ad369b0efdeee to your computer and use it in GitHub Desktop.
Save israellot/a06f244ca53d06c5244ad369b0efdeee to your computer and use it in GitHub Desktop.
Pro Checksum
public static uint ChecksumPro(ReadOnlySpan<byte> arr)
{
if (arr.Length == 0) return 0;
uint sum0 = 0, sum1 = 0, sum2 = 0, sum3 = 0;
int z = 0;
int rem = arr.Length % 16;
var limit = arr.Length - rem;
while (z < limit)
{
sum0 += (uint)(arr[z + 0] + arr[z + 4] + arr[z + 8] + arr[z + 12]);
sum1 += (uint)(arr[z + 1] + arr[z + 5] + arr[z + 9] + arr[z + 13]);
sum2 += (uint)(arr[z + 2] + arr[z + 6] + arr[z + 10] + arr[z + 14]);
sum3 += (uint)(arr[z + 3] + arr[z + 7] + arr[z + 11] + arr[z + 15]);
z += 16;
}
limit = arr.Length - 4;
while (z <= limit)
{
sum0 += arr[z + 0];
sum1 += arr[z + 1];
sum2 += arr[z + 2];
sum3 += arr[z + 3];
z += 4;
}
var sum = sum3 + (sum2 << 8) + (sum1 << 16) + (sum0 << 24);
rem = arr.Length - z;
switch (rem & 3)
{
case 3:
sum += (uint)(arr[z + 2]) << 8;
sum += (uint)(arr[z + 1]) << 16;
sum += (uint)(arr[z + 0]) << 24;
break;
case 2:
sum += (uint)(arr[z + 1]) << 16;
sum += (uint)(arr[z + 0]) << 24;
break;
case 1:
sum += (uint)(arr[z + 0]) << 24;
break;
}
return sum;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment