Хотя вполне вероятно, что вы получите коллизии, если хешируемые значения намного длиннее, чем результирующий хеш, число коллизий все еще достаточно мало для большинства целей (есть 2 128 Всего возможных хэшей, поэтому вероятность того, что две случайные строки сгенерируют один и тот же хеш, теоретически близка к 1 в 10 38 ).
MD5 был изначально создан для проверки целостности, поэтому он очень чувствителен к минимальным изменениям. Незначительные изменения во входе приведут к радикально другому выводу. Вот почему трудно угадать пароль, основываясь только на хэш-значении.
Хотя сам хэш не является обратимым, все еще возможно найти возможное входное значение с помощью чистой грубой силы. Вот почему вы всегда должны добавлять соль, если вы используете MD5 для хранения хэшей паролей: если вы добавляете соль во входную строку, соответствующая входная строка должна включать точно такую же соль, чтобы получить ту же самую соль выходная строка, потому что в противном случае необработанная входная строка, которая соответствует выходу, не будет соответствовать после автоматического посола (т.е. вы не можете просто «перевернуть» MD5 и использовать его для входа в систему, потому что обратный хеш MD5, скорее всего, не будет засоленным строка, которая первоначально привела к созданию хэша).
Таким образом, хеши не являются уникальными, но механизм аутентификации может быть сделан для того, чтобы сделать его достаточно уникальным (что является одним из несколько правдоподобных аргументов для ограничения пароля вместо засоления: множество строк, которые приводят к одному и тому же хешу, вероятно, будет содержать много строки, которые не подчиняются ограничениям на пароли, поэтому сложнее изменить хеш с помощью грубой силы - очевидно, соли все еще хорошая идея).
Большие хэши означают больший набор возможных хешей для одного и того же входного набора, поэтому меньший шанс перекрытия, но пока вычислительная мощность не увеличится настолько, чтобы сделать грубый MD5 тривиальным, это по-прежнему достойный выбор для большинства целей.