Acerca de FNV132 hash
FNV-1 32-bit (Fowler–Noll–Vo hash function) es un algoritmo de hash no criptográfico diseñado para ser rápido y proporcionar una buena distribución de hash. Es parte de una familia de funciones de hash que incluyen FNV-1 y FNV-1a, con variaciones en el tamaño del hash (32-bit, 64-bit, 128-bit, etc.). La versión FNV-1 32-bit produce un hash de 32 bits y es utilizada en aplicaciones como sistemas de archivos, bases de datos y tablas hash.
Características de FNV-1 32-bit
Longitud de salida:
- Genera un hash de 32 bits (4 bytes).
Constantes:
- Offset basis:
0x811C9DC5
- Prime:
0x01000193
- Offset basis:
Proceso de cálculo:
- Inicializa el hash con el offset basis.
- Para cada byte del dato de entrada, multiplica el hash por el prime y luego realiza una operación XOR con el byte del dato.
- La operación es simple y rápida, adecuada para aplicaciones que requieren un hash rápido y efectivo.
Proceso de cálculo de FNV-1 32-bit
Inicialización:
- Inicia con un valor de
hash
igual a0x811C9DC5
.
- Inicia con un valor de
Iteración sobre cada byte del dato:
hash = hash * 0x01000193
hash = hash XOR byte
Ejemplo de implementación de FNV-1 32-bit en Python
def fnv1_32(input_string):
# Constantes de FNV-1 32-bit
FNV_prime = 0x01000193
offset_basis = 0x811C9DC5
# Convertimos la cadena a bytes
input_bytes = input_string.encode('utf-8')
# Inicializamos el hash
hash_value = offset_basis
# Calculamos el hash
for byte in input_bytes:
hash_value = hash_value * FNV_prime
hash_value = hash_value ^ byte
# Devolvemos el hash como un número hexadecimal
return hash_value & 0xFFFFFFFF
# Ejemplo de uso
input_string = "Hola, Mundo!"
hash_result = fnv1_32(input_string)
print(f"Hash FNV-1 32-bit para '{input_string}': {hash_result:#010x}")
En este ejemplo, la cadena "Hola, Mundo!" se convierte en bytes y se calcula su hash FNV-1 32-bit. El resultado se muestra en formato hexadecimal.
Ejemplo de implementación de FNV-1 32-bit en C
#include <stdio.h>
#include <stdint.h>
#include <string.h>
uint32_t fnv1_32(const char *input_string) {
// Constantes de FNV-1 32-bit
const uint32_t FNV_prime = 0x01000193;
const uint32_t offset_basis = 0x811C9DC5;
// Inicializamos el hash
uint32_t hash_value = offset_basis;
// Calculamos el hash
for (size_t i = 0; i < strlen(input_string); i++) {
hash_value *= FNV_prime;
hash_value ^= (uint8_t)input_string[i];
}
// Devolvemos el hash
return hash_value;
}
int main() {
// Cadena de entrada
const char *input_string = "Hola, Mundo!";
// Calculamos el hash
uint32_t hash_result = fnv1_32(input_string);
// Mostramos el hash en formato hexadecimal
printf("Hash FNV-1 32-bit para '%s': %08x\n", input_string, hash_result);
return 0;
}
En este ejemplo, la cadena "Hola, Mundo!" se utiliza para calcular el hash FNV-1 32-bit. El resultado se muestra en formato hexadecimal.
Aplicaciones de FNV-1 32-bit
- Tablas hash: FNV-1 32-bit se utiliza en implementaciones de tablas hash debido a su velocidad y buena distribución.
- Sistemas de archivos: Se utiliza para la verificación rápida de nombres de archivos y rutas.
- Bases de datos: Utilizado para generar claves hash para la indexación y búsqueda rápida.
Ventajas y desventajas de FNV-1 32-bit
Ventajas:
- Rapidez: FNV-1 32-bit es rápido de calcular debido a su simplicidad.
- Buena distribución: Proporciona una buena distribución de hashes para una amplia variedad de datos de entrada.
- Simplicidad: Fácil de implementar y entender.
Desventajas:
- No criptográficamente seguro: FNV-1 32-bit no está diseñado para ser resistente a ataques intencionales y no debe usarse para aplicaciones de seguridad.
- Colisiones: Aunque es raro, es posible que dos cadenas diferentes generen el mismo hash FNV-1 32-bit, lo que se conoce como colisión.
FNV-1 32-bit es una opción popular y efectiva para aplicaciones que requieren un hash rápido y con buena distribución, pero debe utilizarse con precaución en contextos que requieren alta seguridad debido a su vulnerabilidad a colisiones y ataques intencionales.