Leyendo tu código creo que no has comprendido qué es lo que hace la función
explode. De lo contrario, entenderías por qué está mal el último bucle y otras partes.
Tampoco es recomendable acceder a un archivo mientras está abierto (lo haces cuando cuentas las líneas).
También te recomiendo que uses funciones para ordenar tu código, porque es bastante lioso. En varias ocasiones mezclas comandos que forman parte de un proceso con otro que se hace a continuación. No afecta al funcionamiento, pero hace difícil el entenderlo.
Finalmente, no uses md5 ya que es relativamente fácil encontrar colisiones (ataques rainbow).
Este artículo que escribí no hace mucho te ayudará bastante, así como el artículo que enlazo en el mismo.