Я пишу сайт для загрузки файлов и заинтересован в экономии места. Если пользователь загружает файл, я хочу убедиться, что этот файл еще не был загружен ранее (если это было так, я просто укажу на существующий файл в базе данных).
Я думал об использовании sha1_file()
на файл, проверяя базу данных, чтобы увидеть, существует ли дайджест в базе данных дайджестов. Затем я вспомнил принцип «квадратного отверстия» и решил проверить непереваренные файлы друг против друга, если есть совпадение с дайджестом sha1.
Это кажется мне неэффективным. Я полагаю, что мог бы просто сравнить первый килобайт каждого файла друг с другом в случае совпадения контрольной суммы.
Я не слишком задумывался о значении ОЗУ по сравнению с ПЗУ, и вполне возможно, что вычислительная мощность, необходимая для проверки файлов, стоит больше, чем объем памяти, который я бы сэкономил.
Есть ли недостатки этого метода? Я трачу свое время на то, чтобы беспокоиться об этом?
вы могли бы использовать md5( file_data )
генерировать имена файлов, и никогда не будет возможности загрузить один и тот же файл с другим именем. Единственная проблема заключается в том, что технически возможно, что два разных файла генерируют один и тот же md5, но это маловероятно, особенно если два файла имеют одинаковое расширение, так что вы можете считать это не проблемой. под этой схемой нет оснований даже проверять. если два хэша одинаковы, он просто перезаписывает сохраненный файл. так работает большинство механизмов хранения файлов, например, zimg. если вы параноидально относитесь к коллизиям, вы можете сначала увидеть, существует ли файл с вычисленным хешем и расширением, и если это так, вы можете сравнить данные этого сохраненного файла с данными файла, который вы пытаетесь сохранить. если данные неравны, вы можете отправить им уведомление по электронной почте.
$data = file_get_contents('flowers.jpg');
$name = md5($data).'.jpg';
$fh = fopen($name,'w+');
fwrite($fh,$data);
fclose($fh);
Других решений пока нет …