Привет. Подскажите алгоритм хэширования! У меня много файлов (на разных компах), мне надо найти изменённый, (...) Я хочу найти хэш файла а потом сравнивать! Скажите какой хороший??? Чтобы без коллизий ! Спасибо! слышал про SHA?? это оно?
неа, хекс-редакторы да и обычный патч восстанавливают даты (GetFileTime\SetFileTime) MD5 в три раза быстрее SHA1, обычно используют именно его
если требуется определить только модификацию, достаточно использовать crc32, поговаривают, что по скорости он сравним с md5, но зато реализация много проще. а если трбуется хорошая хеш-функция, чтобы без коллизей и стойкая (на сегодняшний день), я бы смотрел в сторону sha256. Читай Шнайдера, пока его еще более-менее легко найти в продаже. А если тебе кажется удобным читать с экрана - на drmist.narod.ru в самом низу ссылка на электронную версию (исходные коды прилогаются). В аттаче к этому посту ты найдешь исходники crc32, sha1 и sha256 на си.
CRC-32 на асм Код (Text): format PE GUI 4.0 entry start include 'win32a.inc' section '.data' data readable writeable CrtTable rd 256 test_str db '123456789' section '.code' code readable executable start: xor ebx, ebx mov edx,CrtTable InitTableLoop: xor eax, eax mov al, bl xor ecx,ecx entryLoop: test eax, 1 jz no_topbit shr eax, 1 xor eax, 0edb88320h jmp entrygoon no_topbit: shr eax, 1 entrygoon: inc ecx test ecx, 8 jz entryLoop mov dword [ebx*4 + edx], eax inc ebx test ebx, 256 jz InitTableLoop mov eax,-1 mov esi,test_str mov ecx,9 computeLoop: xor ebx, ebx xor al, [esi] mov bl, al shr eax, 8 xor eax, dword [4*ebx + CrtTable] inc esi loop computeLoop xor eax, 0FFFFFFFFh exit: invoke ExitProcess,0 section '.idata' import data readable writeable library kernel32,'KERNEL32.DLL' include '\apia\kernel32.inc'
Совсем без коллизий НЕЛЬЗЯ, это все-таки ХЕШ, а не побайтовое сравнение. На практике для такой задачи вполне достаточно CRC-32... да даже CRC-16 вполне потянет.
iamlamer там под коллизиями обычно понимается не то, что один хеш так или иначе может соответствовать двум буферам, а то, что можно иначе, нежели перебором, подобрать два одинаковых хеша к одному буферу. кажется так. К исходнику Crazy_Death хочу добавить, что CrtTable как правило считается зарание. Кроме полинома 0edb88320h иногда используется 004c11db7h, то есть уществует как минимум две функции crc32 с разными таблицами.
2 drmist "Кроме полинома 0edb88320h иногда используется 004c11db7h" а в чем разница? 0edb88320h - использутеся в zip,rar а 004c11db7h где?
asmfan Используйте любой неприводимый в поле GF(2) полином 32й степени... И будет вам счастье) Только это будет уже не CRC-32, потому что "CRC-32" это не только аббревиатура от "циклического изыбточного кода", а что-то типа торговой марки, жестко зафиксированного наименования для жестко зафиксированного алгоритма, описанного в разных там IEEE, ISO, RFC и пр. Можно юзать любую подходящий порождающий полином, даже если для него математически строго доказано, что он не хуже стандартного. Но называть то, что получилось, "CRC-32", IMHO, нельзя. З.Ы. Особенно меня прикалывают некоторые статьи из, кажется, не помню, 29A с фразами типа "давайте рассчитаем CRC, для этого просто просуммируем все байты" и т.п.