2010-08-18 4 views
0
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; 
} 

Не является водонепроницаемым: есть вероятность, что я получу одну и ту же контрольную сумму для двух разных строк.Является ли эта расчетная сумма полностью водонепроницаемой?

+0

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

ответ

5

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

+3

+1, также известный как «принцип пигментных отверстий». –

+0

Грег, +1 за то, что он научил меня новому термину (принцип голубинки). – Patrick

1

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

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

Смежные вопросы