ЖЖ от 2004-12-27 14:35:00
Читаю PHP Inside №8. Цитата:
Чтобы узнать, равны ли два файла, можно использовать следующий способ:
if (sha1_file($file) == sha1_file($file2)) { .. }
С помощью этой конструкции можно, в общем случае, узнать, что два файла неравны, а вот про равенство ничего сказать нельзя — так как у двух разных файлов, может быть одно и тоже значение хеша.
Чтобы узнать, равны ли два файла, можно использовать следующий способ:
if (sha1_file($file) == sha1_file($file2)) { .. }
С помощью этой конструкции можно, в общем случае, узнать, что два файла неравны, а вот про равенство ничего сказать нельзя — так как у двух разных файлов, может быть одно и тоже значение хеша.
Комментарии 39
но довольно трудно привести хотя бы один пример двух таких файлов.
а если это сравнение дополнить так:
if ((sha1_file($filename1) == sha1_file($filename2)) && (filesize($filename1) && filesize($filename2))) { .. }
(т.е. сравнивать и длину файлов), то подобрать совпадающие по хэшу, но не равные будет ну очень сложно. интересно посчитать вероятность совпадения… на
так что на практике такое можно использовать.
я имел ввиду, что нужно сравнивать одновременно и filesize, и sha1_file
а _чисто теоретически_ всё возможно, конечно.
md5($pass) — это хеш пароля. хешировать можно.
1) строки длиной 16 байт и менее не имеют дублей после md5
2) пароли имеют куда более узкий алфавит. т.е. у пароля «мойсуперпароль28748прорукрцлуоке» 256 дублей после md5, но, скорее всего, все они не могут быть введены — потому что совпадения, скорее всего, будут содержать в себе символы, которые не входят в допустимый алфавит. Говоря русским языком, они могут содержать что угодно — \0, \r, \n, \x12 и т.д. Не наберёшь это с клавиатуры.
С файлами ситуация совершенно другая:
1) они могут быть большого размера (мегабайт, например), сколько там дублей сможешь подсчитать?
2) они содержат бинарные данные.
если
По крайней мере так в теории. Но что это нам даёт? Отвечу сразу: ничего. md5(md5(строка)) и md5(md5(ещё одна строка)) вполне могут совпасть. в том случае, если md5(строка) = md5(ещё одна строка)
c4ca4238a0b923820dcc509a6f75849b
c81e728d9d4c2f636f067f89cc14862c
может ли md5('c4ca4238a0b923820dcc509a6f75849b
c81e728d9d4c2f636f067f89cc14862c') == md5('c81e728d9d4c2f636f067f89cc14862c')
я действительно не очень хорошо владею темой.
может ли md5(конкатенация этих строк) = md5(одна из строк)? так?
теоритически — могут существовать такие строки. Но, заметь, это не значит, что существует такая строка (ненулевой длины :) ), что прифигачивая её к любой строке и беря от этого md5 мы всегда получаем то же значение, что и md5 этой самой строки.
имелось в виду md5('c4ca4238a0b923820dcc509a6f75849b') == md5('c81e728d9d4c2f636f067f89cc14862c')
сорри за кривые руки
а хешами — потому что это md5('1') и md5('2') соответственно. или хеш — это не то?
вероятность коллизии.
Или же использовать паралельно два различных алгоритма хеширования?
вероятность выбрать любую точку = 0. и
(это старый прикол над лебеговой мерой ;))