Контрольная сумма для файла.

Buger

Guest
Контрольная сумма для файла.

Задача:
Есть куча файлов (JPEGи), они по мере аплоада заносятся в таблицу. К ним нужно генерить в той же таблице какой-нить хэшик содержимого, для проверки на дубликаты.

Вопрос:
Как лучше (оптимальнее) генерить этот хэшик - по всему содержимому или будет достаточно какой-то части (допустим перывые 1000 символов + размер файла)? Или может еще как-нибудь?
 

SiMM

Новичок
А как насчёт того, что две абсолютно идентичные картинки могут различаться лишь EXIF'ом?
 

white phoenix

Новичок
Buger
PHP:
function crc32_file($file) {return sprintf("%u",crc32(file_get_contents($file)));}
$checksum = crc32_file("/path/to/file.jpg");
определись по какому принципу запись считать уникальным, если по содержанию - код я дал, а если по содержанию, и по названию то дописывай название файла.
lyxsus
для таких целей есть crc

-~{}~ 18.11.05 12:28:

SiMM
и что ты предлогаешь?
 

SiMM

Новичок
> и что ты предлогаешь?
Я предлагаю:
1. Задуматься над этим.
2. Определиться, важно это или этим можно пренебречь - вопрос тредстартера не отражает этого.
3. Проблема решаема - ничто не мешает пропускать EXIF и всё ненужное при подсчёте md5.

white phoenix, кстати ваше решение более требовательно к памяти.
> для таких целей есть crc
CRC не для этих целей. Оно используется для контроля целостности. Хоть и не является абсолютной гарантией. Впрочем, md5 также не является абсолютной гарантией и вполне подвержено коллизиям.
 

white phoenix

Новичок
SiMM
в том числе и для контроля целостности, например после (рас/у)паковки файлов в архив, архиватор проверяет всё ли на месте с помощью crc, но мне кажется его можно использовать и для сравнения двух строк. про какие коллизии Вы говорите? ясное дело что хеши двух разных строк могут быть одинаковы, но они мне не попадались.
 

SiMM

Новичок
> в том числе и для контроля целостности
ТОЛЬКО для контроля. Вероятность совпадения CRC у двух разных файлов гораздо выше, чем вероятность совпадения их md5. Это очевидно даже из того факта, что CRC имеет всего лишь 32 бита (4 млрд. комбинаций), а md5 - 128 бит.
 

tony2001

TeaM PHPClub
>Впрочем, md5 также не является абсолютной гарантией и вполне подвержено коллизиям.
до тех пор, пока там не миллиарды картинок, вероятность получить хотя бы одну коллизию - ничтожно мала.
 

white phoenix

Новичок
SiMM
возможно я ошибаюсь, но мне почему-то кажется что там будет никак не больше 100 000 файлов. а реально я думаю 1000-2000.
ну и что он этим добьется? максимум хрен знает каким способом научиться делать произвольный хеш, что ему это даст?
tony2001
совершенно верно.
 

SiMM

Новичок
white phoenix, в любом случае - пункт "ваше решение более требовательно к памяти" остаётся :)
 

SiMM

Новичок
> думаю не на много
~ на объём файла, для которого подсчитывается CRC32 - вы же вначале вынуждены прочесть в память весь файл, в то время как специальнопредназначенная для этого функция [m]md5_file[/m] скорее всего читает его блоками.
 

SiMM

Новичок
> чтобы снять хеш надо весь файл иметь
Не надо. Файл можно получать мелкими кусками по мере необходимости.
http://aforge.ibd.lv/?22
 

Buger

Guest
Благодарствую. =) Буду юзать crc.
Файлов будет 20-40 тыс.
 

tony2001

TeaM PHPClub
SiMM
вот тебе md5: 30b35bf9f430ac68ca6fe0f3664d7324
верни его в исходный вид.
или хотя бы найди строку, которая возвращает тот же md5.

обо всех теоретических изысканиях на эту тему я в курсе.
и о поиске по словарю знаю.
это всё не значит, что md5() можно реально "взломать" или даже подобрать эквивалент с тем же результатом - это в принципе невозможно (вариант с миллионом лет и бесконечной мощностью - это тоже "невозможно").
 

SiMM

Новичок
> верни его в исходный вид.
tony2001, разве я где-то это обещал? В исходный вид - это, вобщем-то, жирновато будет, не так ли? ;)
http://phpclub.ru/talk/showthread.php?postid=545075#post545075
По-моему слова "Или пока кто-то не займётся этим специально" можно понимать лишь только как "пока специально не начнут заливать файлы с одинаковым md5", и никак иначе.

> md5() можно реально "взломать"
Разве я где-то утверждал подобное?
 

white phoenix

Новичок
Buger
верно
tony2001
да, китайцы ведь тоже что-то предлогали но реально я не видел чтоб хеши взламывали. с бесконечной мощностью можно сделать последовательный брут в диапазоне 0-255, мне кажется это самый реальный метод, а остальное сказка.
 

tony2001

TeaM PHPClub
SiMM
Просто я не совсем понимаю панику по поводу md5.
Ах, сломали за пару лет, на тыщах компьютеров, тупым перебором. Ах, при определённых условиях можно *сделать* наборы данных, которые будут давать одинаковые хэши.
Всё это ерунда в применении к реальным задачам.

Кратко: чего людей пугаете-то ?
 
Сверху