Dependiendo de los algoritmos utilizados, puede ser posible calcular qué tan cerca está la contraseña y esto conduce a ataques de colisión que permiten descifrar la contraseña mucho más rápido que la fuerza bruta.
Según entiendo, es el caso de MD4 que se puede descifrar en milisegundos debido a fallas como esa. No analicé el exploit MD4, pero apuesto a que hay una ecuación de proximidad incrustada en él.
Tomemos un ejemplo idiota: una función hash que es la suma de los códigos ASCII de la contraseña. Las contraseñas AB y BA tendrán el mismo hash 131. Si la contraseña real es AB, el sistema también aceptará BA como la contraseña real. Un poco de ingeniería inversa mostrará una relación: a) cambiar cualquier letra a la siguiente agregará una en el hash; b) agregar una nueva A a la contraseña agrega 65 al hash. Y entonces la grieta está lista. La contraseña devuelta por el crack puede no ser la misma utilizada por el usuario, pero el sistema no notará la diferencia.
Sí, el objetivo de un algoritmo de hash criptográfico es evitar eso. Se supone que es impredecible y, por lo tanto, requiere fuerza bruta. Pero no siempre funciona como se esperaba. Las matemáticas no son perdonadas.
EDIT: MD4, MD5 y SHA1 ya están obsoletos debido a este tipo de ataques. Nuevos algoritmos nacieron para evitar esas vulnerabilidades. Y la comprobación de contraseñas hace un poco más que solo hash. La adopción de nuevos algoritmos no es tan rápida como queremos. Para Linux constantemente actualizado, las contraseñas de base deberían estar usando algoritmos modernos. Pero apuesto a que hay muchos sistemas en el mundo que ejecutan software de más de 10 años porque la nueva versión del sistema operativo puede no ser compatible con las aplicaciones más antiguas o simple por los costos de la licencia si se usa el software de pago. Apuesto a que muchos programas que tienen su propia base de datos de contraseñas separada del sistema tienen poca seguridad.