PHP: Является ли CRC из ZipArchive::statIndex() достаточно уникальным, чтобы его можно было использовать для обнаружения дубликатов файлов во многих zip-архивах?

Если у меня есть несколько zip-файлов, и я перебираю содержимое каждого, чтобы найти уникальные файлы, будет ли значение CRC одинаковым для одного и того же файла в разных zip-архивах?

Метод статиндекс в ZipArchive возвращает такой массив:

Array
(
    [name] => foobar/baz
    [index] => 3
    [crc] => 499465816
    [size] => 27
    [mtime] => 1123164748
    [comp_size] => 24
    [comp_method] => 8
)

Честно говоря, размер файла, вероятно, будет достаточно уникальным для моих нужд, но на всякий случай я искал другой способ определить уникальность.

Из того, что я могу сказать, единственной альтернативой будет извлечение и последующее использование метода файл-хэш, но это будет намного медленнее, чем просто возможность использовать что-то, что доступно из класса ZipArchive.

В моем случае у меня есть каталог примерно из 230 000 изображений, созданных из 30 000 zip-архивов, по 30 изображений в каждом zip-архиве, и я хочу создать базу данных о том, какие изображения взяты из какого zip-архива, и я знаю, что будет много дубликатов.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
278
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Двухэтапный подход

CRC — это насколько я могу судить, 32-битное целое число без знака (4 294 967 295 значений). Для больших файлов, таких как изображения, мы можем предположить, что он имеет плоское случайное распределение. Я бы объединил это с size, чтобы получить строку надеюсь уникальный:

$stat = $zip->statIndex($index);
$str = $stat["crc"] . $stat["size"];

Если метод сжатия одинаков во всех ZIP-файлах, вы можете добавить сжатый размер:

$stat = $zip->statIndex($index);
$str = $stat["crc"] . $stat["size"] . $stat["comp_size"];

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

Я не думаю, что это приемлемо.

Однако, если два изображения возвращают одну и ту же строку, вы все равно можете проверить их более внимательно, чтобы проверить, действительно ли они одинаковы. Вы можете начать с одного из лучших хеши, но почему бы просто не выполнить побайтовое сравнение? Таким образом, вы действительно можете быть абсолютно уверен в отношении уникальности ваших изображений.

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

Поэтому мой подход здесь состоял бы в том, чтобы сначала провести грубую проверку с crc и size. Если это одно и то же, я бы сравнил файлы, чтобы убедиться, что они действительно одинаковы. Таким образом, я никогда не выполняю изменение, предполагая, что два изображения одинаковы, потому что их crs/size одинаковы, когда это не так.

Нет, 32-битная CRC слишком легко сталкивается. Рассмотрите возможность сравнения CRC и размера (и желательно также сжатого размера и метода сжатия) - если все 4 одинаковы, достаточно безопасно предположить, что файлы идентичны.

Однако каково ваше определение «дубликата»?

  • Два файла изображений могут иметь одинаковую полезную нагрузку (фактическая фотография), но разные метаданные (заголовок, комментарий...) — в этом случае вы сами хешируете части файлов, поэтому метаданные игнорируются.
  • Два файла изображения могут изображать одну и ту же сцену, но иметь разные размеры (т.е. 800x600 против 1600x1200) или разное сжатие (с потерями, без потерь, чересстрочное...) - в этом случае вы должны визуально интерпретировать их.
  • Два файла изображения могут привести к отображению одного и того же изображения, но в разных форматах (т. е. PNG, TIFF, JPEG, WEBP...) — в этом случае вы хотите сравнить их визуализированные растровые изображения.

Как видите: извлечение/распаковка файлов позволит вам работать более точно, в первую очередь, используя вашу любимую программу для обнаружения дубликатов.

Другие вопросы по теме