как использовать хэш-функцию для хранения ~ 4 миллионов изображений в файловой системе

Я хочу хранить ~ 1 млн изображений, которые будут изменены на 4 разных типа, поэтому будет ~ 4 миллиона изображений. Как я должен использовать хеш-функции, такие как md5, для равномерного и уникального распространения изображений в структуре каталогов?

Related of "как использовать хэш-функцию для хранения ~ 4 миллионов изображений в файловой системе"

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

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

Этот пример также поместит оригинал и его миниатюры в один и тот же каталог. Это упростит удаление или поиск файлов.

Прежде всего, вам понадобится метод сопоставления имени файла в каталоге:

// $id = A unique identifier (a filename) // It could be useful to make this id the same for the original, // as well as any thumbnails. Your image and variants will all // then end up in the same directory. // $levels_deep = The number of directories deep you want to go. // Want more levels? Use a hashing method with a longer // output, such as sha1 (40 characters). function getDir($id, $levels_deep = 32) { $file_hash = md5($id); $dirname = implode("/", str_split( substr($file_hash, 0, $levels_deep) )); return $dirname; } 

Затем вам нужно записать файлы:

 function store($dirname, $filename) { // The `true` flag here will have `mkdir` create directories recursively. if(!file_exists($dirname) && !mkdir($dirname, 0777, true)) throw new Exception("Could not create directory " . $dirname); return file_put_contents( $dirname . "/" . $filename, "Contents of example file.\n" ); } 

Пример использования:

 store(getDir("myfile.jpg", 4), "myfile.jpg"); store(getDir("myfile.jpg", 4), "myfile_large.jpg"); store(getDir("myfile.jpg", 4), "myfile_small.jpg"); store(getDir("myfile.jpg", 4), "myfile_thumb.jpg"); store(getDir("someOtherFile.jpg", 4), "someOtherFile.jpg"); 

Это сохранит вышеупомянутые пять файлов в этих местах:

 /d/0/6/a/myfile_large.jpg /d/0/6/a/myfile_small.jpg /d/0/6/a/myfile_thumb.jpg /d/0/6/a/myfile.jpg /1/4/4/d/someOtherFile.jpg 

Я не изучал «случайность» бит md5, но он должен быть распределен достаточно равномерно.

MD5 не генерирует всегда уникальные значения. Если это нормально, чтобы изменить файл изображения на все большее число, вы можете сохранить изображение, например {number} _ {variant} .jpg, например 1_1.jpg, 1_2.jpg, 2_1.jpg и так далее.

Чтобы сделать его немного более случайным, вы можете преобразовать увеличивающееся число с Base-10 на Base-26. Изображение 82981_1.jpg стало бы в этом случае 4IJF_1.jpg

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

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

 Timestamp_Number_1OfThe4Kinds Example: 123456789_12_3.png 

Как получить имя изображения:

 function getname($dir, $kindofpicture){ i=0; do{ $i++; $str=$dir.strval(time()).strval($i).$kindofvalue; }while(file_exists($str); return $str; } в function getname($dir, $kindofpicture){ i=0; do{ $i++; $str=$dir.strval(time()).strval($i).$kindofvalue; }while(file_exists($str); return $str; }