Os habeis preguntado alguna vez, ¿qué pasaría si en PHP metiésemos un elemento en una posición muy grande de un array?
Está claro que en los lenguajes de programación tradicionales esto obligaría a rellenar con vacío todos los elementos anteriores, y por tanto esa estructura de datos necesitaría una cantidad enorme de memoria para ser creada. En cambio, con PHP esto no es así:
<?php
$ar[100000000]='Hola';
echo $ar[100000000];
print_r($ar);
?>
Como se puede ver, solamente se ha creado el elemento 100.000.000 del array, de forma que hemos ahorrado una gran cantidad de memoria.
Ahora compliquemoslo un poco más. Si además del elemento en la posición 100.000.000 de antes, ponemos uno en la posición 10, ¿Se crearán los elementos del invervalo 10-100.000.000?
<?php
$ar[100000000]='Hola';
echo $ar[100000000];
$ar[10]='Adios';
echo $ar[10];
print_r($ar);
?>
Pues no, no se han creado, el array contiene solamente dos elementos, el resto está vacío.
Con estos resultados, no es aventurado concluir que PHP implementa los arrays normales, como si fueran listas dinámicas. Si lo comparamos con los arrays tradicionales, éste método conlleva un gran ahorro de memoria en la mayoría de los casos, y una pérdida de rendimiento en todos.
Son hash-lists. Cualquier cosa que pongas como key (sea un número, una cadena, etc.) se computa su hash y se crea una hash-list (sha1 si no recuerdo mal).
En java son muy comunes, y además de facilitar la vida al programador, ofrecen muy buen rendimiento al hacer listas enlazadas.
No sabía lo de la implementación con SHA1. Gracias por el apunte.