Добрый день. Это больше не вопрос, а так, посоветоваться.
Какое-то время мудрил над распределение файлов по его id, и остановился на таком вот варианте:
1. Конвертируем id из десятичного в шестнадцатеричный. Идентификатор должен быть больше или равен 4096, чтобы в итоге шестнадцатеричное число было в длину больше или равным 4.
2. Хранилище состоит из уровней. На каждом уровне по 256 папок. В итоге 256^2 = 65536 папок. Если брать за максимальное оптимальное кол-ва файлов в папке тысячу, то в итоге хранилище у нас на 65536000 файлов (по 1000 в каждой папке). Для названия папки первого уровня, "отрезаем" 2 последних цифры id, для второго уровня еще 2 последних цифры. Таким образом мы добьемся равномерного распределения. Вот пример определения пути:
$dir = substr($hex, -2, 2) . '/' . substr($hex, -4, 2);
3. Для имени файла используем его id и если нужно обезопасить от перебора для скачивания, то добавляем к нему произвольную строку (к примеру hash-сумму, алгоритма crc32 будет достаточно) и по просто по id файл не достать.
Пример: /e5/f5/83f5e5-r45c943k.jpg
Сделав тесты, при 10 млн файлов, в каждой папке было 152-153 файла.
Как вам вариант? Есть ли камни? Криво? Заранее спасибо!