有没有非常快速的校验和生成算法?

Tgy*_*gys 1 .net c# hash performance checksum

搜索了一下,但是我没有真正找到我想要的东西。

我必须每秒验证大约100个byte [16384](以及许多其他任务..)。即将到来的最大问题是速度。

你们知道在C#.NET中有任何非常好的快速的校验和算法吗?它不必很精确,但是如果单个位发生变化,则校验和也应该(通常)也发生变化。

该字节存储在内存中,因此没有任何IO东西可以减慢它的速度。

谢谢!

Jul*_*anR 5

扩展C.Evenhuis的答案,这里有些变化应该会更快一些。我不确定它们的正确性,有更多麻烦的经验的人想帮助我吗?我知道他们提供的校验和与字节的校验和不一样,但是我确实认为他们提供的校验和与字节的校验和一样(不是很好,但显然足够)。

正如我在评论中所说,您可以通过不比较每个字节的字节数,而是将数组视为较小的int数组的4倍或较小的long数组的8倍来提高速度。不过,将其视为long[]唯一可在64位上提供性能优势。

static unsafe uint ChecksumInt(byte[] array)
{
  unchecked
  {
    uint checksum = 0;
    fixed (byte* ptr = array)
    {
      var intPtr = (uint*)ptr;

      var iterations = array.Length / 4;
      var remainderIterations = array.Length % 4;

      for (var i = 0; i < iterations; i++)
      {
        var val = intPtr[i];
        checksum += val;
      }

      while (remainderIterations >= 0) // no more than 3 iterations
      {
        checksum += ptr[array.Length - remainderIterations];
        remainderIterations--;
      }
      return checksum;
    }
  }
}

static unsafe ulong ChecksumLong(byte[] array)
{
  unchecked
  {
    ulong checksum = 0;
    fixed (byte* ptr = array)
    {
      var intPtr = (ulong*)ptr;

      var iterations = array.Length / 8;
      var remainderIterations = array.Length % 8;

      for (var i = 0; i < iterations; i++)
      {
        var val = intPtr[i];
        checksum += val;
      }

      while (remainderIterations >= 0) // no more than 7 iterations
      {
        checksum += ptr[array.Length - remainderIterations];
        remainderIterations--;
      }
      return checksum;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我在64位(Core 2 Duo 3 GHz)上的性能测量,该阵列在10,000次迭代中包含100,000个项目:

  • 每1个字节:00:00:00.7052533
  • 每4个字节:00:00:00.1761491
  • 每8个字节:00:00:00.0856880

所以快了很多。

但是,就像我说的那样,我不确定这是否提供同样好的校验和。