O núcleo do problema é cavar através do diretório inode para o arquivo que você deseja. Alguns sistemas de arquivos fazem isso melhor que outros. Alguns escalam perto dos bilhões, mas se você só tem ... 20K arquivos chegando a esses arquivos são marcadamente mais rápidos. Além disso, grandes contagens de arquivos criam problemas para determinadas ferramentas e podem fazer com que o backup / restauração seja um problema muito mais difícil.
Por acaso, encontrei exatamente o mesmo problema em nosso próprio desenvolvimento (md5sum como nome de arquivo, dimensionamento do mesmo). O que eu recomendei aos nossos desenvolvedores é cortar a corda em pedaços. Eles foram com grupos de 4, mas no sistema de arquivos em que estávamos na época, mesmo que muitos se mostraram problemáticos do ponto de vista de desempenho, eles acabaram dividindo um grupo de 3 para os primeiros 6 trios e deixando o resto como o nome do arquivo no diretório do terminal.
Grupo de 4: 4976/d70b/180c/6142/c617/d0c8/9d0b/bd2b.txt
Grupo de 3: 497/6d7/0b1/80c/614/2c6/17d0c89d0bbd2b.txt
Isso tem a vantagem de manter os tamanhos de diretório pequenos e, como o MD5sum é bastante aleatório, ele cria árvores de diretórios balanceadas. É improvável que esse último diretório obtenha mais do que alguns arquivos. E não foi tão difícil trabalhar em nosso código. Trabalhamos com projetos de vários milhões de arquivos, então o dimensionamento foi muito importante para nós.