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