El Adler-32 es un algoritmo de la suma de comprobación que fue inventado por la marca Adler . Comparado a un control por redundancia cíclica de la misma longitud negocia la confiabilidad para la velocidad. Comparado a su forma original (Fletcher-16), Adler-32 es más confiable que Fletcher-16. Sin embargo, Adler-32 es levemente menos confiable que Fletcher-32
La suma de comprobación Adler-32 es parte de la biblioteca ampliamente utilizada de la compresión de Zlib, como ambos fueron desarrollados por la marca Adler . Un " " de la suma de comprobación del balanceo; la versión de Adler-32 se utiliza en la utilidad de Rsync .
Al principio de un funcionamiento Adler-32, el A se inicializa a 1, B a 0. Las sumas son el modulo hecho 65521 (el número primero más grande más pequeño que 216). Los octetos se almacenan en la orden de red ( endian grande), B que ocupa los dos octetos más significativos.
La función se puede expresar como
A = 1 + D 1 + D 2 +… + n (MOD 65521) del del D B = (1 + D 1) + (1 + D 1 + D 2) +… + (1 + D 1 + D 2 +… + n ) (MOD 65521) del del D = × del n ; D 1 + ( n -1) × D 2 + ( n -2) × D 3 +… + n del del D + n (MOD 65521) Adler-32 ( D ) = × del B ; 65536 + A donde está el D la cadena de octetos para los cuales la suma de comprobación deba ser calculada, y el n es la longitud del D . (La operación del modulo no tenía ninguÌn efecto en este ejemplo, puesto que ningunos de los valores alcanzaron 65521). La primera diferencia entre los dos algoritmos es que las sumas Adler-32 son modulo calculado al número primero, mientras que se calculan las sumas de Fletcher el modulo 24-1, 28-1, o 216-1 (dependiendo del número de pedacitos usados), que son todos los números compuestos usar un número primero permite para que Adler-32 coja diferencias en ciertas combinaciones de octetos que Fletcher no pueda detectar. La segunda diferencia, que tiene el efecto más grande en la velocidad del algoritmo, es que las sumas de Adler están computadas sobre los octetos de 8 bits algo que las palabras de 16 bits, dando por resultado dos veces el número de iteraciones del lazo. Esto da lugar a la suma de comprobación Adler-32 que toma entre uno y medio a dos veces mientras la suma de comprobación de Fletcher para la palabra de 16 bits alineara datos. Para los datos octeto-alineados, Adler-32 es más rápido que la suma de comprobación (e., uno encontrado en el Hierarchical_Data_Format ) de Fletcher correctamente ejecutado. uint32_t datos del adler (el *data de uint8_t, size_t len)/*: Indicador a los datos que se sumarán; len está en octetos * { uint32_t a = 1, b = 0; mientras que (len) { ¿el size_t tlen = len > 5550? 5550: len; len - = tlen; hacer { un += *data++; b += a; } mientras que (--tlen); un %= MOD_ADLER; b %= MOD_ADLER; } volver (b << 16) | a; } Algunos trucos se utilizan aquí para la eficacia: Piedra de Jonatán descubierta en 2001 que Adler-32 tiene una debilidad para los mensajes muy cortos. Él escribió el " Breve, el problema es que, para los paquetes muy cortos, Adler32 está garantizado para dar la cobertura pobre de los pedacitos disponibles. No tomar mi palabra para ella, piden la marca Adler. :-) " El problema es que el A de la suma no envuelve para los mensajes cortos. El valor máximo del A para un mensaje de 128 octetos es 32640, que está debajo del valor 65521 usado por la operación del modulo. Una explicación extendida se puede encontrar en el RFC 3309, de el cual asigna el uso por mandato CRC32 en vez de Adler-32 para el SCTP, el protocolo de la transmisión del control de la corriente.
Ejemplo
La suma Adler-32 del " de la secuencia ASCII ; Wikipedia" ser calculado como sigue: Código A B del ASCII (demostrado como base 10) W: 87 1 + 87 = 88 0 + 88 = 88 i: 105 88 + 105 = 193 88 + 193 = 281 k: 107 193 + 107 = 300 281 + 300 = 581 i: 105 300 + 105 = 405 581 + 405 = 986 p: 112 405 + 112 = 517 986 + 517 = 1503 e: 101 517 + 101 = 618 1503 + 618 = 2121 d: 100 618 + 100 = 718 2121 + 718 = 2839 i: 105 718 + 105 = 823 2839 + 823 = 3662 a: 97 823 + 97 = 920 3662 + 920 = 4582 A de = maleficio (base 16) 920 = 398 B = 4582 = maleficio 11E6 Salida = 300286872 = maleficio 11E60398 Comparación con la suma de comprobación de Fletcher
Puesta en práctica del ejemplo
Una puesta en práctica optimizada en el lenguaje de programación C funciona como sigue: lang=" del
Más importante, usando sumas temporales (de 32 bits) más grandes, es posible sumar muchos de datos antes de necesitar reducir el modulo 65521. El requisito es que desborda el modulo 65521 de la reducción se debe realizar antes de las sumas, que causarían un modulo implícito de la reducción 232 = 4294967296 y corromperían el cómputo.
El valor mágico 5550 es el número más grande de sumas que se puedan realizar sin b que desborda. Cualquier valor más pequeño es también permitido; 4096 pueden ser convenientes en algunos casos. Porque esta puesta en práctica no reduce totalmente a, su límite es levemente más bajo que los 5552 mencionados en el RFC. No es la prueba que 5550 es seguros (y 5551) es un pedacito intrincado, y comienza probando que a puede ser a lo más 0x1013a al principio del lazo interno. Ventajas y desventajas
Advertencia: Como el estándar CRC-32, la suma de comprobación Adler-32 se puede forjar fácilmente y es por lo tanto insegura para proteger contra la modificación intencional del .
Tiene la ventaja sobre un CRC que puede ser computado más rápidamente en el software .
Adler-32 tiene una debilidad para los mensajes cortos con poco cientos octetos, porque las sumas de comprobación para estos mensajes tienen una cobertura pobre de los 32 pedacitos disponibles. Debilidad
Random links: Wilson, Nueva York | Mohammad Rafique | Nicasio, California | Sven Lidman (lexicógrafo)