Uma função de hash é uma função que converte dados de comprimento arbitrário em um valor de tamanho fixo (o hash ou digest). A mesma entrada sempre produz o mesmo hash, mas basta 1 bit de diferença na entrada para gerar um hash completamente diferente.
A propriedade central de um bom hash criptográfico é a unidirecionalidade. É praticamente impossível recuperar a entrada original apenas a partir do valor de hash. Por isso, ao armazenar senhas como hash em vez de texto puro, mesmo que os dados vazem, não é possível descobrir o conteúdo original de imediato.
Uma colisão ocorre quando duas entradas diferentes têm o mesmo hash. Em teoria elas existem, mas, em um hash seguro, criá-las intencionalmente deve ser computacionalmente inviável. MD5 e SHA-1 foram descontinuados justamente porque passou a ser possível criar colisões.
Para armazenar senhas, o hash sozinho não basta. Como a mesma senha produz o mesmo hash, adiciona-se a cada entrada um valor aleatório, o salt, antes de gerar o hash, e usam-se hashes lentos como bcrypt e Argon2 para retardar ataques de adivinhação em massa.