Если у меня есть несколько 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-архива, и я знаю, что будет много дубликатов.






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 одинаковы, достаточно безопасно предположить, что файлы идентичны.
Однако каково ваше определение «дубликата»?
Как видите: извлечение/распаковка файлов позволит вам работать более точно, в первую очередь, используя вашу любимую программу для обнаружения дубликатов.