Como você está usando o S3, a quantidade de arquivos não deve ser um problema. No entanto, considere o que acontece quando você precisa procurar um único arquivo manualmente .. A listagem de alguns arquivos zilhão no seu navegador não será divertida.
Portanto, para este caso, você deve ter algum tipo de estrutura de árvore "navegável por humanos", cujos subdiretórios finais contêm uma quantidade razoável de arquivos.
Eu recomendo expandir e dividir o id (supondo que seja numérico) ou prefixar o nome de usuário.
Exemplo de ID:
id1 = 123
id1_expanded = 000/000/000/123
http://xxx.us-east-1.amazonaws.com/users/000/000/000/123/username.jpg
id2 = 1000002
id2_expanded = 000/001/000/002
http://xxx.us-east-1.amazonaws.com/users/000/001/000/002/username.jpg
Exemplo de nome de usuário:
username1 = luccas
http://xxx.us-east-1.amazonaws.com/users/l/lu/luc/luccas/random_number.jpg
username2 = ukautz
http://xxx.us-east-1.amazonaws.com/users/u/uk/uka/ukautz/random_number.jpg
Em qualquer caso, a maioria das estratégias inventadas para o design da estrutura de armazenamento tenta resolver os problemas que você simplesmente não tem no S3: quantidade de arquivos por diretório, sharding em servidores de armazenamento ... coisas assim.
Editar : Os longos nomes de arquivos que você descreveu são geralmente escolhidos por motivos de "segurança" - > Contanto que você não use um algoritmo para derivá-lo do username + id, qualquer relação entre o arquivo e um usuário específico é ocultada (dado apenas o nome do arquivo). Novamente: use algum tipo de estratégia de subdiretório (pelo motivo discutido acima).