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/

10-16 23:59