Если ваш выходной буфер недостаточно велик, чтобы скопировать всю исходную строку и завершающий NUL, тогда выходная строка не будет завершена NUL.
В вашем случае MD5 равен 33 байта, включаяNUL, поэтому NUL не копируется.Когда вы читаете строку назад, вы читаете за концом буфера.
Делайте последние 33 байта длиной, и ВСЕГДА добавляйте NUL к последнему символу в месте назначения при использовании strncpy.
int n = 32;
char *src = "some really really long, more than 32 chars, string."
char dst[n+1];
strncpy(dst, src, n);
dst[n] = '\0';