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

标签 c# .net performance hash checksum

四处搜索了一下,但我并没有真正找到我要找的东西。

我必须每秒验证大约 100 个字节 [16384](+ 许多其他任务..)。拐角处出现的最大问题是速度。

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

字节存储在内存中,因此没有 IO 东西会减慢它的速度。

谢谢!

最佳答案

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

正如我在评论中所说,您可以通过不比较每个字节的字节来大大提高速度,而是将数组视为小 4 倍的整数数组,或小 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;
    }
  }
}

我在 64 位(Core 2 Duo 3 GHz)上对包含 100,000 个项目的数组进行了 10,000 次迭代的性能测量:

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

所以快了很多。

但是,正如我所说,我不确定这是否提供了同样好的校验和。

关于c# - 有没有非常快速的校验和生成算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10335203/

相关文章:

c# - 通过 TCP 发送长 XML

java - 即使是单个学生或单个类(class),返回集合或集合的接口(interface)是一个好习惯吗?如果是,为什么?

.net - Visual Studio 2002中的编译器选项?

sql - 计数非常慢,有 700 万行

performance - 知道为什么 Go 在递归斐波那契上似乎相对较慢吗?

performance - Python 性能 : iteration and operations on nested lists

c# - VS2010性能分析: How can I identify Worker Threads?(CurrentThread.Name产生异常)

c# - 如何在 C# 中将 null 数组反序列化为 null?

c# - Silverlight XAP 文件未更新

c# - 是否可以创建一个包含多页 tiff 文件所有帧的 base64 字符串?