Eu recomendaria usar apenas MD5 ou qualquer coisa conceitualmente equivalente. Ao renomear arquivos pelo resumo do conteúdo, você não apenas concede exclusividade (sempre armazene em cache as imagens pelo maior tempo possível e com a renomeação baseada em conteúdo, bem, com uma adequada, é possível armazenar em cache as imagens praticamente para sempre).
Além disso, não é grande coisa, mas, no entanto, não é um caso hipotético puro quando usuários diferentes carregam exatamente a mesma imagem. Apenas pronto para o uso, você terá uma pequena otimização do armazenamento de dados.
Quanto a qualquer outra coisa proposta: quanto a mim, sou um forte oponente em manter qualquer tipo de informação auxiliar em um nome de arquivo. Quando eu era muito mais jovem (e um pouco mais magro :), eu era um desenvolvedor de Perl e tinha o hábito duvidoso de armazenar tantas informações auxiliares no nome de arquivo quanto o senso comum me permitia, já que os recursos de padrão de string do Perl são impressionantes. E cheguei à conclusão de que, falando em desenvolvimento web, é sempre melhor escolher manter os dados associados ao arquivo separadamente do nome do arquivo.
Lembre-se de que hoje em dia, quando as interfaces móveis estão dominando, o nome real do arquivo é menos importante do que há 5, 10 anos atrás. Mas mesmo que isso seja crucial no contexto de sua aplicação, você sempre pode envolver alguma mágica da velha escola com o envolvimento do Content-Disposition: attachment; filename="pretty_file_name.jpg"
cabeçalho HTTP, construindo qualquer nome de arquivo relevante que desejar. Além disso, os navegadores modernos estão abrindo caminho para o novo atributo HTML5, o download . Não acredito que realmente ver o nome da imagem "legível por humanos" seja algo que você deva pensar na maioria dos casos.
UPD: Uma modificação pode ser feita para não haver muitos arquivos em um diretório - basta pegar as 3 primeiras letras e criar o diretório.