Recomiendo usar solo md5 o cualquier cosa conceptualmente equivalente. Al renombrar archivos por resumen de su contenido, no solo está otorgando exclusividad (siempre almacena en caché las imágenes durante el mayor tiempo posible, y con el cambio de nombre basado en contenido, bueno, con el correcto, puede almacenar en caché las imágenes prácticamente para siempre).
Además, no es gran cosa, pero no es un caso hipotético puro cuando diferentes usuarios cargan exactamente la misma imagen. Recién listo, tendrá una pequeña optimización de almacenamiento de datos.
En cuanto a cualquier otra cosa propuesta: en cuanto a mí, soy un fuerte oponente de mantener cualquier tipo de información auxiliar en un nombre de archivo. Cuando era mucho más joven (y un poco más delgado :), era un desarrollador de Perl y tenía la dudosa costumbre de almacenar tanta información auxiliar en el nombre del archivo como me permitía el sentido común, ya que las características del patrón de cadena de Perl son impresionantes. Y llegué a la conclusión de que, hablando de desarrollo web, siempre es una mejor opción mantener los datos asociados con el archivo por separado del nombre del archivo.
Tenga en cuenta que hoy en día, cuando dominan las interfaces móviles, el nombre real del archivo es algo menos importante que hace 5, 10 años. Pero incluso si esto será crucial en el contexto de su aplicación, siempre puede involucrar un poco de magia de la vieja escuela con la participación del Content-Disposition: attachment; filename="pretty_file_name.jpg"
encabezado HTTP, construyendo cualquier nombre de archivo relevante que desee. Además, los navegadores modernos están allanando el camino para el nuevo atributo HTML5, descargar . No creo que ver el nombre de la imagen "legible para humanos" sea algo en lo que deba pensar en la mayoría de los casos.
UPD: Se puede hacer una modificación para no tener demasiados archivos en un directorio, solo tome las primeras 3 letras y cree el directorio.