Consiglierei di usare solo md5 o qualcosa di concettualmente equivalente. Rinominando i file in base al loro contenuto, non solo si garantisce l'unicità (memorizzare sempre nella cache le immagini il più a lungo possibile, e con la ridenominazione basata sul contenuto, beh, con una corretta, è possibile memorizzare nella cache le immagini praticamente per sempre).
Inoltre, non è un grosso problema, ma non è un caso puramente ipotetico quando utenti diversi caricano esattamente la stessa immagine. Appena pronto avrai una piccola ottimizzazione della memorizzazione dei dati.
Per quanto riguarda qualsiasi altra cosa proposta: per quanto mi riguarda, sono fortemente contrario a conservare qualsiasi tipo di informazione ausiliaria nel nome di un file. Quando ero molto più giovane (e un po 'più magro :), sono stato uno sviluppatore Perl e ho avuto la dubbia abitudine di memorizzare quante più informazioni ausiliarie nel nome del file mi hanno permesso il senso comune, dal momento che le caratteristiche del modello di stringa del Perl sono fantastiche. E sono giunto alla conclusione che, parlando di sviluppo web, è sempre una scelta migliore mantenere i dati associati al file separatamente dal nome del file.
Tieni presente che al giorno d'oggi, quando dominano le interfacce mobili, il nome del file effettivo è una cosa meno importante rispetto a 5, 10 anni fa. Ma anche se questo sarà cruciale nel contesto della tua applicazione, puoi sempre coinvolgere un po 'di magia della vecchia scuola con il coinvolgimento Content-Disposition: attachment; filename="pretty_file_name.jpg"
dell'intestazione HTTP, costruendo qualsiasi nome di file pertinente che desideri. Inoltre, i browser moderni stanno aprendo la strada al nuovo attributo HTML5, il download . Non credo che vedere il nome di un'immagine "leggibile dall'uomo" sia una cosa a cui dovresti pensare nella maggior parte dei casi.
UPD: è possibile effettuare una modifica per non avere troppi file in una directory - basta prendere le prime 3 lettere e creare dir.