Recomiendo usar solo md5 o algo conceptualmente equivalente.
Al cambiar el nombre de los archivos mediante el resumen de sus contenidos, no solo otorga unicidad (siempre almacene las imágenes en caché el mayor tiempo posible, y con el cambio de nombre basado en el contenido, bueno, con la imagen adecuada, puede almacenar las imágenes prácticamente siempre).
Además, no es un gran problema, pero sin embargo, no es un caso hipotético puro cuando diferentes usuarios cargan exactamente la misma imagen. Una vez que esté 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 :), he sido un desarrollador de Perl y tenía el dudoso hábito de almacenar tanta información auxiliar en el nombre del archivo como me lo permitió el sentido común, ya que las características de los patrones de cadena de Perl son increíbles. Y llegué a la conclusión de que, hablando de desarrollo web, es siempre la mejor opción para mantener los datos asociados con el archivo por separado del nombre del archivo.
Tenga en cuenta que hoy en día, cuando las interfaces móviles están dominando, el nombre real del archivo es algo menos importante que hace 5, 10 años. Pero incluso si esto es crucial en el contexto de su aplicación, siempre puede involucrar algo de magia de la vieja escuela con la participación de 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 por humanos" sea algo en lo que debería 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 3 primeras letras y cree el directorio.