Я бы порекомендовал использовать только md5 или что-нибудь концептуально эквивалентное. Переименовывая файлы, переваривая их содержимое, вы не только даете уникальность (всегда кэшируете изображения как можно дольше, а с помощью переименования на основе контента, ну, при правильном, вы можете кэшировать изображения практически всегда).
Кроме того, это не имеет большого значения, но, тем не менее, это не чисто гипотетический случай, когда разные пользователи загружают одно и то же изображение. Просто из коробки у вас будет небольшая оптимизация хранения данных.
Что касается всего предложенного: что касается меня, я решительный противник сохранения любой вспомогательной информации в имени файла. Когда я был намного моложе (и немного стройнее :)), я был разработчиком Perl и имел сомнительную привычку хранить столько же вспомогательной информации в имени файла, сколько позволял мне здравый смысл, поскольку возможности строковых шаблонов Perl потрясающие. И я пришел к выводу, что, говоря о веб-разработке, всегда лучше хранить данные, связанные с файлом, отдельно от имени файла.
Имейте в виду, что в настоящее время, когда доминируют мобильные интерфейсы, реальное имя файла является менее важной вещью, чем это было 5, 10 лет назад. Но даже если это будет иметь решающее значение в контексте вашего приложения, вы всегда можете задействовать некоторую магию старой школы с использованием Content-Disposition: attachment; filename="pretty_file_name.jpg"
заголовка HTTP, создавая любое подходящее имя файла, которое вы пожелаете. Кроме того, современные браузеры прокладывают путь к новому HTML5-атрибуту загрузки . Я не верю, что на самом деле видеть «читабельное» имя изображения - это то, о чем вы должны думать в большинстве случаев.
UPD: можно внести изменения, чтобы в одном каталоге не было слишком много файлов - достаточно взять первые 3 буквы и создать каталог.