Fletchers16校验和适用于小数据吗?

时间:2017-08-11 10:37:46

标签: c checksum

使用wikipedia Fletcher's checksum上的直接实现,我们可以获得相同的校验和,例如" BCA"和" CAB"以及" BAC"和" ACB"。

这是预期的吗? Fletcher16校验和不应该考虑块的顺序吗?

可以通过使用以下代码中显示的数据对索引进行“或”来轻松解决这个问题。

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; // Original
      sum1 = (sum1 + index | data[index]) % 255; // The "fix"
      sum2 = (sum2 + sum1) % 255;
   }

   return (sum2 << 8) | sum1;
}

0 个答案:

没有答案