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

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

statindex метод в ZipArchive возвращает массив, подобный следующему:

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

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

Из того, что я могу сказать, единственной альтернативой было бы извлечь и затем использовать метод file-hash , но это было бы намного медленнее, чем просто возможность использовать что-то, сделанное доступным из ZipArchive.класс.

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

Ответы [ 2 ]

1 голос
/ 19 июня 2019

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

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

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

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

1 голос
/ 19 июня 2019

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

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 одинаковы, когда они не совпадают.

...