【发布时间】:2017-08-11 10:37:46
【问题描述】:
使用wikipedia Fletcher's checksum 上的直接实现,我们可以得到相同的校验和,例如“BCA”和“CAB”以及“BAC”和“ACB”。
这是预期的吗?
Fletcher16 校验和不应该考虑块的顺序吗?
可以通过将索引与数据进行 OR' 运算来轻松修复缺陷,如下面的代码所示......
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;
}
【问题讨论】:
-
“OR'ing the index”会丢弃信息。 “对索引进行异或”或“添加”会更有意义。
-
用 XOR 代替 OR 也会改变问题..
-
@MichaelFoukarakis 更改为 XOR 不会更改 3 个问题的答案,因为它们都引用了缺少
(X)OR index的发起者算法。它确实会影响建议改进的质量。