Ако наистина трябва да гарантирате 100%, че файловете са 100% идентични, тогава трябва да направите сравнение байт към байт. Това просто е включено в проблема - единственият метод за хеширане с 0% риск от фалшиво съвпадение е функцията за идентичност!
Това, което ни остава, са преки пътища, които могат бързо да ни дадат бързи отговори, за да прескочим сравнението байт по байт някои от времето.
По правило единственият пряк път за доказване на равенство е доказването на идентичност. В OO код, който ще показва два обекта, където всъщност е един и същ обект. Най-близкото нещо във файловете е, ако обвързване или NTFS съединение означава, че два пътя са към един и същ файл. Това се случва толкова рядко, че освен ако естеството на работата не го направи по-обичайно от нормалното, няма да бъде чиста печалба за проверка.
Така че ни остава кратък път за намиране на несъответствия. Не прави нищо, за да увеличи пропуските ни, но прави пропуските ни по-бързи:
- Различен размер, не равен байт по байт. Простички!
- Ако ще прегледате един и същ файл повече от веднъж, хеширайте го и запишете хеша. Различен хеш, гарантирано не равен. Намаляването на файловете, които се нуждаят от сравнение едно към едно, е огромно.
- Много файлови формати вероятно имат някои общи области. Особено първите байтове за много формати обикновено са "магически числа", заглавки и т.н. Или ги пропуснете, или пропуснете тогава и след това проверете последното (ако има шанс да са различни, но е нисък).
След това е въпросът да направите действителното сравнение възможно най-бързо. Зареждането на партиди от 4 октета наведнъж в цяло число и извършването на сравнение на цели числа често ще бъде по-бързо от октет по октет.
Нарязването на резби може да помогне. Един от начините е да разделите действителното сравнение на файла на повече от една операция, но ако е възможно по-голяма печалба ще бъде намерена чрез извършване на напълно различни сравнения в различни нишки. Трябва да знам малко повече за това, което правите, за да давам много съвети, но основното нещо е да се уверя, че резултатът от тестовете е безопасен за нишки.
Ако имате повече от една нишка, разглеждаща едни и същи файлове, накарайте ги да работят далеч една от друга. напр. ако имате четири нишки, можете да разделите файла на четири или можете да имате един да вземе байт 0, 4, 8, докато друг вземе байт 1, 5, 9 и т.н. (или 4-октетна група 0, 4, 8 и т.н. ). Последното е много по-вероятно да има проблеми с фалшиво споделяне от първото, така че не го правете .
Редактиране:
Зависи и какво точно правите с файловете. Казвате, че се нуждаете от 100% сигурност, така че тази част не се отнася за вас, но си струва да добавите за по-общия проблем, че ако цената на фалшиво положителен резултат е загуба на ресурси, време или памет, а не действителен провал , тогава намаляването му чрез размит пряк път може да бъде нетна печалба и може да си струва профилиране, за да видите дали това е така.
Ако използвате хеш, за да ускорите нещата (поне може да намери някои определени несъответствия по-бързо), тогава Призрачният хеш на Боб Дженкинс е добър избор; не е криптографски защитен, но ако това не е целта ви, той създава като 128-битов хеш много бързо (много по-бързо от криптографския хеш или дори от подходите, предприети с много GetHashCode()
реализации), които са изключително добри, за да нямат случайни сблъсъци ( вид умишлени сблъсъци, избягване на криптографски хешове е друг въпрос). Приложих го за .Net и го сложих на nuget, защото никой друг нямаше, когато установих, че искам да го използвате.
person
Jon Hanna
schedule
24.08.2012
not 100% match the two files with the same hash
Сигурен ли си? Знаете ли MD5, SHA2, SHA-224, SHA-256, SHA-384, SHA-512? и техните вероятности? - person L.B   schedule 25.08.2012