# Multihash | Lección 2 de 6

## **Multihash**

Ocasionalmente, un algoritmo de hashing puede demostrarse como inseguro, lo que significa que ya no cumple con las características que definimos anteriormente. Esto ya ha sucedido con sha1. Con el tiempo, otros algoritmos pueden demostrar ser insuficientes para el direccionamiento de contenido en IPFS y otros sistemas de información distribuidos. Por esta razón, y para apoyar múltiples algoritmos criptográficos, necesitamos poder saber qué algoritmo se utilizó para generar el hash de un contenido específico.

<figure><img src="https://3475658396-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKgqW3bJ4VPgLJqRfjj6f%2Fuploads%2FtJ2D9kndDrVYG57WwUJc%2Fimage.png?alt=media&#x26;token=2d7a4cc2-30db-45df-a2fa-d4da7fa71566" alt=""><figcaption><p>¿Cuál es el algoritmo de hashing utilizado en un hash?</p></figcaption></figure>

Entonces, ¿cómo podemos hacer esto? Para admitir múltiples algoritmos de hashing, usamos multihash.

### Formato Multihash&#x20;

Un [multihash](https://multiformats.io/multihash/) es un hash auto-descriptivo que contiene metadatos que describen tanto su longitud como el algoritmo criptográfico que lo generó. Los CIDs de Multiformats son a prueba de futuro porque utilizan multihash para **admitir** **múltiples algoritmos de hashing** en lugar de depender de uno específico.

Los multihashes siguen el patrón TLV (tipo-longitud-valor). Esencialmente, al "hash original" se le antepone el tipo de algoritmo de hashing aplicado y la longitud del hash.

<figure><img src="https://3475658396-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FKgqW3bJ4VPgLJqRfjj6f%2Fuploads%2FO1voTXMGdDF4h2T2MAXI%2Fimage.png?alt=media&#x26;token=2e18758e-1312-4483-8c4c-a485a3f5c010" alt=""><figcaption><p>Formato multihash</p></figcaption></figure>

* **tipo**: identificador del **algoritmo criptográfico** utilizado para generar el hash (por ejemplo, el identificador de sha2-256 sería 18 - 0x12 en hexadecimal) - ver la [tabla de multicodec](https://github.com/multiformats/multicodec/blob/master/table.csv) para todos los identificadores.
* **longitud**: la **longitud real del hash** (usando sha2-256 sería de 256 bits, lo que equivale a 32 bytes) -&#x20;
* **valor**: el **valor real del hash**

Para representar un CID como una cadena compacta en lugar de binario plano (una serie de 1s y 0s), podemos usar **codificación base**. Cuando IPFS fue creado inicialmente, utilizó la codificación **base58btc** para crear CIDs que se veían así:

QmY7Yh4UquoXHLPFo2XbhXkhBvFoPwmQUSa92pxnxjQuPU

El formato multihash y la codificación base58btc habilitaron esta primera versión del CID, ahora referida como Versión 0 (CIDv0), y sus caracteres iniciales Qm... siguen siendo fáciles de reconocer.

Sin embargo, con el tiempo, surgieron dudas sobre si este formato multihash sería suficiente:

* ¿Cómo sabemos qué método se utilizó para codificar los datos?&#x20;
* ¿Cómo sabemos qué método se utilizó para crear la representación de cadena del CID? ¿Siempre estaremos usando base58btc?

&#x20;Para abordar estas preocupaciones, fue necesaria una evolución a la próxima versión de un CID. En las siguientes lecciones exploraremos lo que se agregó a la especificación para llevarnos a la versión actual del CID: CIDv1.
