не понял вашего вопроса.
что значит не однозначен?
так, начинаем перечислять и исправлять допущенные вами в одном предложении ошиПки:
MD5, как и следует из название не алгоритм шифрования, а "Message-Digest Algorithm" см. одноимённый RFC 1321.
Т.е. необратимая свёртка.
Применяются подобные алгоритмы для контроля целостности сообщения: digest = MD5(message)
Результат digest всегда является однозначной функией от message, т.е. зависит только от message, и ни от чего более. В этом плане он однозначен.
Как вы понимаете, digest имеет фиксированную разрядность ( в нашем случае 128 двоичных бит), а message может быть любой длины.
Соответственно, нормальна ситуация, когда разным message, соответствует один digest, т.е. :
MD5(message0) = MD5(message1) = MD5(message2) = ...
Это называется коллизиями.
Соответственно, если вы ставите себе задачу, найти по digest оригинальное message0 (т.е. обратить алгоритм), то очевидно, что вы можете найти другое messageX.
В таком случае вам нужно искать message, такое что не только digest = MD5(messageX), но и выполняющее ряд других ограничений, уже не имеющих отношения собственно к MD5.
Например - начинаться с определённых символов, быть опр. длины, не содержать опр. символом и т.п.