Является ли этот расчет контрольной суммы полностью водонепроницаемым? - PullRequest
0 голосов
/ 18 августа 2010
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 ]

5 голосов
/ 18 августа 2010

Поскольку возможных строк больше, чем длинных значений, несомненно, две разные строки приводят к одной и той же контрольной сумме.

1 голос
/ 18 августа 2010

Контрольная сумма никогда не может быть водонепроницаемой, поскольку она содержит меньше данных, чем исходные данные, для которых вы вычисляете контрольную сумму.

Если вы хотите настоящую водонепроницаемую «контрольную сумму», вам необходимо создать вторую «контрольную сумму».экземпляр ваших данных и убедитесь, что он содержит те же данные, что и исходные данные, хотя он не обязательно должен быть в том же формате (может быть зашифрован или сжат).

...