stringtranslate.com

Hashing de Pearson

El hash de Pearson es una función hash no criptográfica diseñada para una ejecución rápida en procesadores con registros de 8 bits . Dada una entrada que consta de cualquier número de bytes, produce como salida un único byte que depende en gran medida de cada byte de la entrada. Su implementación requiere solo unas pocas instrucciones, además de una tabla de búsqueda de 256 bytes que contiene una permutación de los valores del 0 al 255. [1]

Esta función hash es una CBC-MAC que utiliza un cifrado de sustitución de 8 bits implementado a través de la tabla de sustitución . Un cifrado de 8 bits tiene una seguridad criptográfica insignificante, por lo que la función hash de Pearson no es criptográficamente fuerte , pero es útil para implementar tablas hash o como código de verificación de integridad de datos , para lo cual ofrece estos beneficios:

Una de sus desventajas en comparación con otros algoritmos de hash diseñados para procesadores de 8 bits es la tabla de búsqueda sugerida de 256 bytes, que puede ser prohibitivamente grande para un microcontrolador pequeño con un tamaño de memoria de programa del orden de cientos de bytes. Una solución alternativa a esto es utilizar una función de permutación simple en lugar de una tabla almacenada en la memoria del programa. Sin embargo, el uso de una función demasiado simple, como T[i] = 255-i, derrota en parte la usabilidad como función hash, ya que los anagramas darán como resultado el mismo valor hash; el uso de una función demasiado compleja, por otro lado, afectará negativamente a la velocidad. El uso de una función en lugar de una tabla también permite extender el tamaño del bloque. Tales funciones naturalmente tienen que ser biyectivas , como sus variantes de tabla.

El algoritmo se puede describir mediante el siguiente pseudocódigo , que calcula el hash del mensaje  C utilizando la tabla de permutación  T :

El algoritmo hash de Pearson es h := 0 para cada c en C bucle h := T[ h xor c ] fin del bucle volver h

La variable hash ( h) se puede inicializar de forma diferente, por ejemplo, a la longitud de los datos ( C) módulo 256.

Ejemplos de implementación

DO#, 8 bits

clase pública PearsonHashing  { Hash de byte estático público ( entrada de cadena )     { byte [] T = { /* Permutación de 0-255 */ };       hash de bytes = 0 ;    byte [] bytes = Codificación . UTF8 . GetBytes ( entrada );    foreach ( byte b en bytes )     { hash = T [ hash ^ b ];     } devuelve hash ;  }}

Véase también

Referencias

  1. ^ Pearson, Peter K. (junio de 1990), "Fast Hashing of Variable-Length Text Strings" (PDF) , Communications of the ACM , 33 (6): 677, doi :10.1145/78973.78978, archivado desde el original (PDF) el 2012-07-04 , consultado el 2013-07-13
  2. ^ Lemire, Daniel (2012), "La universalidad del hash iterado sobre cadenas de longitud variable", Discrete Applied Mathematics , 160 (4–5): 604–617, arXiv : 1008.1715 , doi :10.1016/j.dam.2011.11.009