Una posible forma sería calcular la firma MD5 del archivo (o el ID del archivo en una base de datos), y luego compilar/encontrar la ruta en función de eso.
Por ejemplo, dicen que obtenemos una firma MD5 como "1ff8a7b5dc7a7d1f0ed65aaa29c04b1e"
El camino puede ser como "/ 1 f/f" o "/ 1f/ff/8a"
La razón es que se no desea tener todos los archivos en 1 carpeta, y desea tener la capacidad de "particionarlos" en diferentes servidores, o una SAN o lo que sea de forma igualmente dispersa.
La firma MD5 es una cadena de 16 caracteres "hexadecimales". Así que nuestro ejemplo de "/ 1f/ff/8a" nos da 256 * 256 * 256 carpetas para almacenar los archivos de esa debería ser suficiente para cualquiera :)
actualización, debido a la demanda popular:.
NOTA - Me acabo de dar cuenta de que estamos hablando específicamente de cómo MediaWiki lo hace. Esto es no ahora MediaWiki lo hace, pero otra forma en la que se pudo haber hecho.
Por "firma MD5" me refiero a hacer algo como esto (ejemplos de código en Perl):
use Digest::MD5 'md5_hex';
my $sig = md5_hex($file->id);
$ SIG es ahora de 32 caracteres alfanuméricos: "1ff8a7b5dc7a7d1f0ed65aaa29c04b1e"
luego construir una estructura de carpetas como esto:
my $path = '/usr/local/media';
map { mkdir($path, 0666); $path .= "/$_" } $sig =~ m/^(..)(..)(..)/;
open my $ofh, '>', "$path/$sig"
or die "Cannot open '$path/$sig' for writing: $!";
print $ofh "File contents";
close($ofh);
estructura de carpetas se parece
/
usr/
local/
media/
1f/
f8/
a7/
1ff8a7b5dc7a7d1f0ed65aaa29c04b1e
Esta respuesta es incorrecta, por Nohat, a continuación. – Rob
Gracias por señalar la falta de claridad. Corregido ahora. – JDrago