Любые предостережения для генерации уникальных имен файлов для случайных изображений путем запуска MD5 над содержимым изображения? - PullRequest
6 голосов
/ 15 октября 2008

Я хочу генерировать уникальные имена файлов для каждого изображения, поэтому я использую MD5 для создания имен файлов. Поскольку два одинаковых изображения могут приходить из разных мест, я бы хотел на самом деле основывать хэш на содержимом изображения. Какие предостережения это представляет?

(делает это с PHP5 за то, что он стоит)

Ответы [ 9 ]

5 голосов
/ 15 октября 2008

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

Одно предостережение в том, что вы должны быть осторожны при удалении изображений. Если вы удаляете запись изображения, которая указывает на какой-либо файл, и вы тоже удаляете файл, возможно, вы удаляете файл с другой записью, указывающей на то же изображение (например, принадлежащее другому пользователю).

3 голосов
/ 16 октября 2008

Вы должны использовать SHA-1 вместо MD5, потому что MD5 сломан. Есть пары разных файлов с одним и тем же хешем MD5 (не теоретические; они на самом деле известны, и есть алгоритмы для генерации еще большего количества пар). Для вашего приложения это означает, что кто-то может загрузить два разных изображения, которые будут иметь одинаковый хеш-код MD5 (или кто-то может сгенерировать такую ​​пару изображений и опубликовать их где-нибудь в Интернете, чтобы два ваших пользователя позже попытались загрузить их, с сбивающие с толку результаты).

3 голосов
/ 15 октября 2008

Учитывая абсолютно случайное содержимое файла и хороший криптографический хеш, вероятность того, что будут два файла с одинаковым значением хеш-функции, достигает 50%, когда количество файлов примерно равно 2 (количество бит в хэш-функции / 2) , То есть для 128-битного хэша будет 50% -ная вероятность хотя бы одного коллизии, когда число файлов достигнет 2 ^ 64.

Содержимое вашего файла определенно не случайно, но я понятия не имею, насколько сильно это влияет на вероятность столкновения. Это называется атака на день рождения, если вы хотите, чтобы Google для получения дополнительной информации.

Это вероятностная игра. Если количество изображений будет существенно меньше 2 ^ 64, вы, вероятно, в порядке. Если вы все еще обеспокоены, использование комбинации SHA-1 плюс MD5 (как предлагает другой ответ) дает вам в общей сложности 288 высококачественных битов хеша, что означает, что у вас будет 50% вероятность столкновения после того, как там 2 ^ 144 файла. 2 ^ 144 - это очень большое число. Могучий большой. Можно даже сказать, огромный.

2 голосов
/ 15 октября 2008

Мне кажется, если вы в порядке с 32-символьными именами файлов.

Редактировать: Я бы не стал использовать это в качестве основы (скажем) центральной базы данных террористических фотографий ФБР, поскольку злоумышленник с достаточной мотивацией, вероятно, мог бы получить изображение с таким же MD5, существующий. Если это было , то вы могли бы вместо этого использовать SHA1, что несколько более безопасно.

1 голос
/ 15 октября 2008

Вместо этого вы можете использовать UUID?

0 голосов
/ 03 августа 2013

ImageMagick и PHP-класс imagick, которые обращаются к нему, могут интерпретировать изображения более субъективно, чем функции хеширования, с помощью таких факторов, как цвет. Есть бесчисленное множество методов и пользовательских предпочтений, которые необходимо учитывать, поэтому вот несколько ресурсов, посвященных нескольким подходам, чтобы увидеть, что может подойти для вашего предполагаемого приложения:

Любая из функций хеширования, например MD5, будет пытаться только определить, идентичны ли файлы - по битам , чтобы не проверять визуальное сходство (с погрешностью при сжатии с потерями или небольшом кадрировании ).

0 голосов
/ 15 октября 2008

Возможно, вы захотите изучить технологию P2P-сетей, используемую для идентификации дубликатов файлов. Решение, включающее MD5, SHA-1 и длину файла, будет довольно надежным (и, вероятно, излишним).

0 голосов
/ 15 октября 2008

Это займет много времени. Почему бы вам просто не назначить им последовательные идентификаторы?

0 голосов
/ 15 октября 2008

Если у вас есть два одинаковых изображения, загруженных из разных мест, скажем, стоковая фотография, то вы можете переписать «оригинал». Однако это будет означать, что вы храните только одну копию, а не две.

Учитывая сказанное, я не вижу особых проблем с тем, как вы это делаете.

...