A razão para os hashes serem diferentes é que echo inclui uma nova linha no final da string de saída para torná-la bonita. Isso pode ser proibido pelo sinalizador -n (se sua implementação de echo oferecer suporte a ele) ou por outro programa (como printf ):
> echo "a" | md5sum
60b725f10c9c85c70d97880dfe8191b3 -
> echo -n "a" | md5sum
0cc175b9c0f1b6a831c399e269772661 -
> printf "a" | md5sum
0cc175b9c0f1b6a831c399e269772661 -