这个校验和计算是否完全防水?

时间:2010-08-18 08:54:12

标签: bit-manipulation checksum

long make_checksum(const char* str)
{
  long chk=0;
  long rot=0;
  while(*str)
  {
    rot<<=9;
    rot|=(rot>>23);
    rot^=*(char*)str++;
    chk+=rot;
  }
  return chk;
}

不防水意味着:我可以为两个不同的字符串获得相同的校验和。

2 个答案:

答案 0 :(得分:5)

因为有更多可能的字符串而不是长值,所以肯定会有两个不同的字符串导致相同的校验和。

答案 1 :(得分:1)

校验和永远不会防水,因为它包含的数据少于计算校验和的原始数据。

如果你想要一个真正的防水“校验和”,你需要创建数据的第二个“实例”并确保它包含与原始数据相同的数据,尽管它不必相同格式(可以加密或压缩)。