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/