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/