c - 这是计算 fletcher64 校验和的正确方法吗

标签 c checksum reliability

fletcher16 源代码在 wikipedia 上是这样给出的.

uint16_t Fletcher16( uint8_t* data, int count )
{
   uint16_t sum1 = 0;
   uint16_t sum2 = 0;
   int index;

   for( index = 0; index < count; ++index )
   {
      sum1 = (sum1 + data[index]) % 255;
      sum2 = (sum2 + sum1) % 255;
   }

   return (sum2 << 8) | sum1;
}

根据该示例,我按如下方式实现了 64 位版本。

unsigned long Fletcher64( unsigned int* data, int count )
{
   unsigned long sum1 = 0;
   unsigned long sum2 = 0;
   int index;

   for( index = 0; index < count; ++index )
   {
      sum1 = (sum1 + data[index]) % UINT_MAX; // UINT_MAX = 2^32
      sum2 = (sum2 + sum1) % UINT_MAX;
   }

   return (sum2 << 32) | sum1;
}

我的方法是正确的,还是我做错了什么?

最佳答案

大多数散列算法都采用内存块参数和要散列的字节数(有时是位)。您已将字节数更改为字数——一个相当重要的更改。

此外,由于您更改了计算大小,sum2 的计算方式也发生了变化。只要您不尝试逐值复制原始算法,这就很好,但如果这是一种兼容的优化,那么这可能是错误的。

关于c - 这是计算 fletcher64 校验和的正确方法吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9521284/

相关文章:

real-time - 在写入日志文件时使用 Flume 将日志文件摄取到 HDFS 中

gwt - HtmlUnitDriver 的可靠性如何?

c - OpenMP 点积和指针

c - 与许多实时设备保持连接

c - 即使我在计算之前已经将校验和设置为 0,TCP 校验和计算也会返回 0

Java校验和方法

c - 通过 C 程序管道日志输出以方便日志轮换

c - C 中的二叉树 - 段错误

linux - 递归地为每个文件创建单独的 MD5 文件

database - 如何在不运行 PostgreSQL 服务器的情况下初始化 PostgreSQL 数据库