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;
}
Не является водонепроницаемым: есть вероятность, что я получу одну и ту же контрольную сумму для двух разных строк.Является ли эта расчетная сумма полностью водонепроницаемой?
Вопросы, которые вы хотите задать, - это значения контрольной суммы, равномерно распределенные по всем возможным строкам, и «если у меня есть одна случайная выбранная строка и другая строка, идентичная первой, за исключением очень небольшого количества изменений, будет ли я статистически получать два разных значения контрольных сумм, чтобы я мог сказать хороший из ошибочного? ». Другие люди решили эту проблему и используют сложную математику, чтобы все исправить. Используйте одно из своих решений. CRC32 (или CRC64) чрезвычайно хорош для этого; так и многие другие «хэш-функции». Обычно в ваших библиотеках времени исполнения можно найти один файл. –