Подскажите наиболее надежную хэш функцию для обнаружния точечных искажений в файле или где можно узнать про это.
Если дефекты создает не злоумышленник, а просто они возникают "случайно и равномерно", то подойдет любой код контроля ошибок. Например, CRC32 (его структура и параметры рассчитаны с учетом теории помехоустойчивого кодирования). Ну а если хочется бОльшей стойкости, то любая криптостойкая хеш-функция : MD2, MD5, SHA-1, TIGER, RIPEMD, только учти, что они на порядок более медленные.
ИМХО нет смысла экономить на спичках - чтение с диска будет гораздо дольше вычисления нормального хеша.
S_T_A_S_ без обид : на спичках не экономим, а потом спрашиваем, почему софт требует все более и более мощных процессоров любая применяемая технология должна быть АДЕКВАТНА задаче - если задача найти случайные ошибки, то CRC32 ее решает с уровнем достоверности 1-(2^31), этого мало ? пусть в мире 8000 инсталляций твоей программы, пусть каждый пользователь запускает ее восемь раз в день пусть каждый раз с каждым ее образом случаются какие-то неприятности (crazy !) тогда первый случай необнаружения искажения кода для CRC32 произойдет в среднем через 90 лет (надеюсь нигде не ошибся)
Вот здесь, Oleg_SK сравнивал скорость CRC32, MD5 и XOR (!), разницы никакой нет. Даже если применить SHA1, скорость мало изменится. Учитывая, что для применения того или другого часто достаточно украсть подходящий GPL код, то разница в сложности использования равна нулю. Если же писать самому, то разница во времени имплементации смешная. А экономить на практически бесплатном преимуществе конечно можно, некоторые и GUIDы боятся генерировать. ЗЫ: GUID, кстати, не рекомендуют использовать как имя временного файла даже.
Сам подумай, есть ли вероятность существования файла с таким именем. Особенно в драйвере. А если нужна ссылка как доказательство существования такого мнения - вот. Еще искать лениво.
Почитай любую книжку по помехоустойчивому кодированию или по кодам с исправлением ошибок (в т.ч. на русском есть много и советских и парочка современных). Там раздел "циклические коды".
Что такое уровень достоверности и чем он отличается от вероятности обнаружения ошибки, которая есть просто 1-1/(2^32) ?
1-1/(2^32) ? по теории вероятности два противоположных события имеют вероятность 1-p, где p - вероятность события вероятность обнаружения ошибки 1-1/(2^32) вероятность не обнаружения ошибки 1/(2^32)
Уважаемый RElf ! Я уже многократно говорил, что очень внимательно отношусь к Вашим замечаниям. Конечно же, Вы совершенно правы - если говорить чисто математическим языком то фраза должна была звучать так : „если задача найти случайные ошибки, то CRC32 ее решает, с вероятностью необнаружения ошибки 1-(2^(-32))“
Буду занудой, но 1-(2^(-32)) - это вероятность именно обнаружения, вероятность необнаружения равна 2^(-32).
мстишь ? да, похоже я сегодня не с той ноги встал : если задача найти случайные ошибки, то CRC32 ее решает, с вероятностью необнаружения ошибки (2^(-32))
RElf )) Не, я этим не увлекаюсь. Хотя, когда-то, еще во времена СССР выиграл у однорукого бандита 11 рублей за 15 копеек (это была не хилая сумма). З.Ы.: Все, заканчиваю оффтопик.
RElf у меня есть несколько приватных вопросов. расчитываю на помощь. куда можно задать? t0_DMD@mail.ru