> For the complete documentation index, see [llms.txt](https://educacion.gitbook.io/programacion/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://educacion.gitbook.io/programacion/ud6-estructuras-de-datos-avanzadas/page-2/conxuntos/funciones-hash.md).

# Funciones Hash

Tratase de un tipo de función que toma datos de calquera tamaño e os converte nunha saída de tamaño fixo, chamada hash.

<figure><img src="/files/Slik7dl2bGLw8XNYicvJ" alt=""><figcaption></figcaption></figure>

En estructuras de datos tipo hash, estas funcións empreganse para determinar en que posición da taboa se almacena o obxecto. Para isto, a idea é a seguinte:

* Empregase a **función hash** para determinar un identificador numérico representativo do obxecto (XOR, suma de valores ASCII,...)
* En base ao valor obtido na función hash, é necesario realizar un **mapeo**: empregase operacións tipo módulo para determinar en que posición exacta da táboa se vai a almacenar o obxecto

{% hint style="warning" %}
En Java, para poder traballar con hash, é necesario que o obxecto co que traballamos teña redefinidos os métodos **equals()** e **hashcode():**
{% endhint %}

```java
public class Persona {

    private String nome;
    private int idade;

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof Persona persona))
            return false;
        return idade == persona.idade && Objects.equals(nome, persona.nome);
    }

    @Override
    public int hashCode() {
        return Objects.hash(nome, idade);
    }
}
```

### Características clave

* **Determinista:** A mesma entrada na función sempre produce a mesma saída
* **Unidirecciónal:** A partir dos valores podese construir o hash, pero e case imposible reconstruir os valores a partir do hash
* **Sensible a cambios:** Un cambio na entrada da función provoca que o hash resultado sexa completamente diferente&#x20;
* **Coste computacional baixo:** Debe de ser extremadamente eficiente xa que se vai a empregar cada vez que realicemos unha inserción ou procura na estructura.
* **Numero de colisións baixo:** Entendese por colisión que dous obxectos con valores diferentes devolvan o mesmo hash. En caso de colisión, estratexias comunes poden ser:
  * Buscar a **seguinte posición libre:** Engadese o obxecto en i + 1
  * **Encadeamento:** Cada posición da táboa esta vinculada con unha lista enlazada, na que se van colocando as coincidencias.

### Usos comunes

* **Estructuras de datos tipo hash:** Permiten implementar estructuras de datos con acceso a valores individuales moi eficiente (búsqueda por clave). Se o que se busca e recuperar un conxunto de valores, a eficiencia baixa.
* **Xestión de credenciais:** Nunca se garda o contrasinal, almacenase un valor hash con elementos optimizados para evitar ataques de diccionario. O que se compara é o valor hash
* **Checksum:** A idea do checksum é un cálculo que se emprega en redes de comunicacións e criptografía para determinar que o enviado e o mesmo que o recibido. MD5 ou SHA-256 son algoritmos que empregan funcións de tipo hash para este propósito


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://educacion.gitbook.io/programacion/ud6-estructuras-de-datos-avanzadas/page-2/conxuntos/funciones-hash.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
