Adler-32 je hashovací funkce vyvinutá Markem Adlerem . Jedná se o modifikaci Fletcherova kontrolního součtu . Vypočítá hodnotu kontrolního součtu podle RFC 1950 pro bajtové pole nebo jeho fragment. Tento algoritmus výpočtu kontrolního součtu se liší od CRC32 ve výkonu. Adler-32 se používá v knihovně Zlib . Verze funkce rolujícího kontrolního součtu se používá v obslužném programu rsync .
Stejně jako u Fletcherova kontrolního součtu byl Adlerův součet navržen tak, aby vytvořil kontrolní součet s účinností detekce chyb srovnatelnou s CRC . Přestože výkon detekce chyb kontrolního součtu Adler a Fletcher je téměř stejný jako u relativně slabých CRC, v některých důležitých případech fungují mnohem hůře než dobré CRC.
Kontrolní součet Adler-32 se získá výpočtem dvou 16bitových kontrolních součtů A a B a zřetězením jejich bitů do 32bitového celého čísla. A je rovno součtu všech bajtů v řetězci plus jedna a B je součet všech jednotlivých hodnot A v každém kroku. Na začátku provádění funkce Adler-32 je A inicializováno na jedničku a B je inicializováno na nulu. Součty se berou modulo 65521 (největší prvočíslo menší než 2 16 ). Bajty se zapisují v síťovém pořadí , B zabírá 2 nejvýznamnější bajty.
Funkci lze vyjádřit jako:
A = 1 + D 1 + D 2 + ... + D n (mod 65521) B = (1 + D 1 ) + (1 + D 1 + D 2 ) + ... + (1 + D 1 + D 2 + ... + D n ) (mod 65521) = n × D 1 + ( n -1) × D 2 + ( n -2) × D 3 + ... + D n + n (mod 65521) Adler-32 ( D ) = B × 65536 + Akde D je řetězec bajtů, pro které se má vypočítat kontrolní součet, a n je délka D.
Hodnota Adler-32 pro řetězec ASCII „Wikipedia“ se vypočítá takto:
ASCII kód AB (desítkové) 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 = 920 = 398 hex (základ 16) B=4582=11E6 hex Výstup = 300286872 = 11E60398 hexOperace sčítání modulo nemá v tomto příkladu žádný účinek, protože žádná z hodnot nedosáhla 65521.
Algoritmus kontrolního součtu Adler je totožný s algoritmem Fletcher součtu s několika rozdíly. První rozdíl je v tom, že v případě Adlerovy funkce je součet A inicializován hodnotou 1. Druhý rozdíl mezi oběma algoritmy spočívá v tom, že součet v algoritmu Adler-32 se počítá modulo k prvočíslu 65521, zatímco Fletcherovy součty se počítají modulo -1, - 1, -1 (v závislosti na počtu použitých bitů), což jsou složená čísla . Tato změna v algoritmu byla provedena za účelem dosažení lepšího míchání bitů. Použití prvočísla umožňuje funkci Adler-32 zaznamenat rozdíly v určitých kombinacích bajtů, které funkce Fletcher nedokáže zachytit. Třetím rozdílem, který nejvýrazněji ovlivňuje rychlost algoritmu, je to, že součty funkce Adler-32 jsou počítány přes 8bitová slova spíše než 16bitová slova, což zdvojnásobuje počet iterací smyčky. To má za následek, že kontrolní součet Adler-32 trvá jeden a půl až dvakrát déle než kontrolní součet Fletcher pro 16bitová data slova. Pro data rozdělená na bajty je Adler-32 rychlejší než algoritmus Fletcher.
Ačkoli Adlerův kontrolní součet není oficiálně definován pro jiné délky datových slov, největší prvočíslo menší než 2 4 = 16 a 2 8 = 256 lze použít k implementaci 8 a 16 bitových Adlerových kontrolních součtů pro účely srovnání. Díky podobnému algoritmu má kontrolní součet Adler podobný výkon jako Fletcherův součet. Všechny 2bitové chyby jsou detekovány pro datová slova kratší než M*(k/2) bitů, kde k je velikost kontrolního součtu, M je modul Adlerova součtu. Stejně jako u kontrolního součtu Fletcher platí, že nejhorší hodnota pravděpodobnosti nezjištěné chyby nastane, když je v každém bloku dat stejný počet nul a jedniček. Adler-8 a Adler-16 detekují všechny skupinové chyby kratší než k/2 bitů. Adler-32 detekuje všechny skupinové chyby ne delší než 7 bitů. Obrázek 1 ukazuje závislost pravděpodobnosti nedetekovaných chyb pro kontrolní součty Adlera a Fletchera pro bitovou chybovost 10 −5 .
Lepší míchání bitů poskytované kontrolním součtem Adler by mělo vést k lepšímu výkonu při hledání chyb než Fletcherův součet. Ale jak ukazuje RFC 3385 , Fletcher-32 funguje lépe než Adler-32 při 8 KB. Adlerův kontrolní součet překoná Fletcherův součet pouze v případě 16bitových kontrolních součtů, a to pouze v oblasti těchto součtů, kde je Hammingova vzdálenost 3. Problém je v tom, že i přes to, že použité prvočíslo jako modul operace má za následek lepší míchání bitů, což má za následek méně správných hodnot kontrolních součtů dostupných pro kódová slova. Ve většině případů to neguje pozitivní efekt lepšího míchání. Kontrolní součet Fletcher tedy překonává součet Adler ve všech případech kromě součtu Adler-16 aplikovaného na krátká datová slova. Dokonce ani zvýšení efektivity vyhledávání chyb nemusí stát za zvýšení výpočetní režie, která přichází s použitím modulárních operací.
Autoři RFC 3385 porovnávali výkon detekce chyb. Shrnutí jejich výsledků je uvedeno v tabulce:
Algoritmus | d | blok | i/bajt | Velikost T | T-pohled | P udb | P uds |
---|---|---|---|---|---|---|---|
Adler-32 | 3 | 2 19 | 3 | - | - | 10 -36 | 10 -35 |
Fletcher-32 | 3 | 2 19 | 2 | - | - | 10 -37 | 10 -36 |
IEEE-802 | 3 | 2 16 | 2,75 | 2 18 | 0,5/b | 10 -41 | 10 -40 |
CRC32C | 3 | 2 31 −1 | 2,75 | 2 18 | 0,5/b | 10 -41 | 10 -40 |
V tabulce: d je minimální vzdálenost na bloku délky bloku, blok je délka bloku v bitech, i / byte je počet programových instrukcí na bajt, velikost T je velikost tabulky (pokud je prohlížení nutné), T-look je počet zobrazení na bajt, P udb je pravděpodobnost nezjištěných skupinových chyb, P uds je pravděpodobnost nezjištěných jednotlivých chyb.
Pravděpodobnosti nezjištěných chyb ve výše uvedené tabulce jsou vypočteny za předpokladu rovnoměrného rozložení dat.
„Dobrá“ hašovací funkce se vyznačuje víceméně rovnoměrným rozložením vypočtených hodnot. Je zřejmé, že Adler-32 tento požadavek pro krátká data nesplňuje (maximální hodnota A pro 128bajtovou zprávu je 32640, což je méně než 65521, číslo, na kterém se provádí modulo operace). Kvůli tomuto nedostatku dali vývojáři protokolu SCTP přednost před tímto algoritmem CRC32 , protože v síťovém protokolu je nutné hašování krátkých sekvencí bajtů.
Stejně jako pro CRC32 , i pro Adler-32 lze snadno zkonstruovat kolizi , tedy pro daný hash najít další zdrojová data, která mají stejnou funkční hodnotu.
Oproti CRC32 má výhodu v tom, že je rychlejší softwarově.
Jednoduchá implementace algoritmu v jazyce C je následující kód:
uint32_t adler32 ( const unsigned char * buf , size_t buf_length ) { uint32_t s1 = 1 ; uint32_t s2 = 0 ; while ( buf_length -- ) { s1 = ( s1 + * ( buf ++ ) ) % 65521 ; s2 = ( s2 + s1 ) % 65521 ; } return ( s2 << 16 ) + s1 ; }Efektivní implementaci naleznete v kódu knihovny zlib .
Hashovací funkce | |
---|---|
obecný účel | |
Kryptografický | |
Funkce generování klíčů | |
Kontrolní číslo ( srovnání ) | |
Hashe |
|